Toon posts:

[delphi] classes gebruiken

Pagina: 1
Acties:

Verwijderd

Topicstarter
dag...

ik ben voor school bezig een emulatie van een kassa te maken, en nu zit ik met het volgende probleem:

we moeten met classes werken, en moeten er 3 aanmaken van de klasse TGeldLa..
dat is het probleem niet

maar nu heb ik een procedure:

code:
1
2
3
4
5
6
7
8
procedure TFormKassa.ButtonVulKassaClick(Sender: TObject);
var Memowie: string;
var classwie: string;
begin
Memowie:='Memo'+ComboVulKassa.text;
classwie:=ComboVulKassa.text;
classwie.Tonen(Memowie);
end;


Als ik op de knop Vulkassa klik, wordt memowie memo + diegene die aan het werk is...
dus als ad aan het werk is, dan wordt het memo
memoad
classwie wordt dus
ad

ik heb dus al een keer 3 classes aangemaakt:
code:
1
2
3
ad := geldla.create;
bea := geldla.create;
cor := geldla.create;


maar hoe krijg ik het nou voor elkaar dat die
code:
1
2
3
Memowie:='Memo'+ComboVulKassa.text;
classwie:=ComboVulKassa.text;
classwie.Tonen(Memowie);

nou werkt??
dus dat er ipv
code:
1
classwie.Tonen(Memowie);


dit:
code:
1
ad.Tonen(memoad);


wordt aangeroepen??

anders moet ik weer allemaal met if then else gaan werken, en dat is mij teveel werk ;)
-EDIT-
en ook als ik het progsel wil uitbreiden, moet ik dat telkens aanpassen..
anders hoef ik maar een paar dingetjes aan te passen
-EDIT-

groeten,
Bas

[ Voor 7% gewijzigd door Verwijderd op 05-12-2002 19:29 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:56
Huh?

Jij wilt dus 3 objecten aanmaken (geen classes, een class is een 'blueprint' van hoe die objecten eruitzien, een object instantieer van een class) van het type TGeldLade.

Nu wil jij dynamisch gaan bepalen welk object er moet genomen worden door zelf , at runtime die objectnaam te gaan bepalen? :? Dat gaat niet lukken. (Ik verbaas me er telkens weer over hoeveel mensen er dat zo gaan proberen :/ )

Wat je wel kunt doen, is in de Objects property van de combobox voor iedere 'werknemer' een referentie bijhouden naar hun eigen object van TGeldLade.
Dan kan je achter die knop volgende code steken:
code:
1
2
3
4
5
6
7
8
var
  HuidigeLade    : TGeldLade;
begin
  if ComboVulKassa.ItemIndex > 0 then begin
    HuidigeLade := ComboVulKassa.Items.Objects[ComboVulKassa.ItemIndex];
    HuidigeLade.Tonen();
  end;
end;

Disclaimer: niet getest, dus er kunnen wel wat syntaxfoutjes inzitten
Maar ik denk toch dat je nog eens je cursus of een boekje over OO erbij zult moeten pakken als ik zo naar je code kijk....

https://fgheysels.github.io/


Verwijderd

Topicstarter
Maar ik denk toch dat je nog eens je cursus of een boekje over OO erbij zult moeten pakken als ik zo naar je code kijk....
ik ben maar net begonnen met programmeren: net begonnen op het HBO.. is eerste keer dat ik hiermee werk...
de code zal langzaam maar zeker beter worden.. hoop ik ;)

  • decipherer
  • Registratie: Februari 2002
  • Laatst online: 13:51
offtopic:
ik denk dat jij op het hbo in Eindhoven zit? ik heb dezelfde opdracht vorig jaar ook gehad ;)


Ik heb net even in mijn code gekeken, en ik heb een procedure gemaakt die alle geldlades in 1 keer toont. Deze heeft gewoon hard-coded Ad, Bea en Cor in zich.

Als je het wil doen zoals jij voorstelt, moet je in de class geldla een functie Tonen maken.

[ Voor 8% gewijzigd door decipherer op 05-12-2002 20:06 ]

De beste ideeën komen als je bezig bent.


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:56
Verwijderd schreef op 05 december 2002 @ 19:44:
[...]


ik ben maar net begonnen met programmeren: net begonnen op het HBO.. is eerste keer dat ik hiermee werk...
de code zal langzaam maar zeker beter worden.. hoop ik ;)



Nouja. Dan moet je toch heel goed weten dat het bepalen van een objectnaam op die manier:
code:
1
MyObject = 'naam' + Edit1.Text;

(en alle andere varianten)
niet kan in talen als Delphi, C#, ..... (misschien kan het wel in PHP enzo, maar het is en blijft ranzig).

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik had het eigenlijk wel moeten weten ja, maar ik moet het toch altijd even proberen. Bij PHP kan het wel, geloof ik.

En ja, ik zit op HBO eindhoven ;)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

whoami schreef op 05 December 2002 @ 20:02:
Nouja. Dan moet je toch heel goed weten dat het bepalen van een objectnaam op die manier:
code:
1
MyObject = 'naam' + Edit1.Text;

(en alle andere varianten)
niet kan in talen als Delphi, C#, ..... (misschien kan het wel in PHP enzo, maar het is en blijft ranzig).
Helaas, u gaat niet door voor de wasmachine :)

VCL introduceert in de class TObject (oftewel de rootclass) de functie ClassName, welke een AnsiString retourneert met de RTTI classname. Wat je zegt kan dus wel degelijk als je over alle instances loopt en alle namen vergelijkt. Maja op dat moment moet je een array (of TList preferrably) maken met alle instances, en dan kun je net zo goed direct in die lijst gaan graven op basis van de ItemIndex van de combobox.

Naast ClassName zit er nog veel meer interessant RTTI spul in TObject, denk aan geile constructies als (in BCB, me sucks at Delphi):
C++:
1
2
3
4
5
if(MyGeldlade->InheritsFrom(__classid(TMyToyshopGeldlade))) 
  {
  MyToyshopGeldlade*   l_Geldlade = (MyToyshopGeldlade*)MyGeldlade;
  ...
  }


In C++ kan het allemaal dus binnen VCL met dezelfde functies, en daarbuiten (indien RTTI enabled is) kun je met de 'typeid' operators zo de naam opvragen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Voorbeeld uit MSDN gejat uit luiheid
// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo.h>

class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
void main()
{
   Derived* pd = new Derived;
   Base* pb = pd;
   cout << typeid( pb ).name() << endl;   //prints "class Base *"
   cout << typeid( *pb ).name() << endl;   //prints "class Derived"
   cout << typeid( pd ).name() << endl;   //prints "class Derived *"
   cout << typeid( *pd ).name() << endl;   //prints "class Derived"
   delete pd;
}

En het lijkt me sterk dat C# geen RTTI ondersteunt :Y)

Professionele website nodig?


Verwijderd

Ehh, je wilt iets over een class weten en laat vervolgens iets totaal anders zien. Zo definieer je een classwie als string (variabele). Daarna probeer je van een stringvariable te procedure 'tonen' aan te roepen (?).


Dit lijkt er meer op:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Type
  TMyClass = class 
     protected
     private
        FcMyField: String;
     public
       Property cMyField: String read FcMyField write FcMyField;
       Procedure Tonen;
     published
   end;

inmplementation
   procedure TMyClass.tonen; 
      begin
          ShowMessage(FcMyString);
      end


Maar goed, je hele verhaal is nogal wazig, en daarnaast is het een huiswerkopdracht :P

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Maar goed, je hele verhaal is nogal wazig, en daarnaast is het een huiswerkopdracht
Ach huiswerk is tegenwoordig weer toegestaan mits duidelijk genoeg uitgelegd, en hier kan ie iig nog een hoop van leren.

Professionele website nodig?


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Wat je zou kunnen doen is een array maken waar je de mogelijke namen en objecten in zet, dus een array van een record. Zoiets zou denk ik wel kunnen werken:
Delphi:
1
2
3
4
5
6
type
   TKassaRec = record
      Kassa: TGeldLa;
      Naam: string;
   end;
var Kassas: array[0..2] of TKassaRec;

En dan in die Kassas array die objecten en de namen zetten. Als je dan de Kassa bij een naam wilt opzoeken, kun je gewoon met een for-loopje door die array heen wandelen.

[ Voor 1% gewijzigd door _Thanatos_ op 06-12-2002 10:20 . Reden: typo ]

日本!🎌


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 00:49
_Thanatos_ schreef op 06 december 2002 @ 10:19:
Wat je zou kunnen doen is een array maken waar je de mogelijke namen en objecten in zet, dus een array van een record. Zoiets zou denk ik wel kunnen werken:
Delphi:
1
2
3
4
5
6
type
   TKassaRec = record
      Kassa: TGeldLa;
      Naam: string;
   end;
var Kassas: array[0..2] of TKassaRec;

En dan in die Kassas array die objecten en de namen zetten. Als je dan de Kassa bij een naam wilt opzoeken, kun je gewoon met een for-loopje door die array heen wandelen.
Waarom niet?

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type
   TKassaRec = object
      Kassa: TGeldLa;
      Naam: string;
     public
      procedure Tonen;
   end;

procedure TKassaRec.Tonen;
begin
  writeln(Naam,Kassa.[var]
end;

var Kassas: array[0..2] of TKassaRec;

begin
  Kassas.Tonen;
end;


Wat overbodige dingen weggelaten en NIET getest.

  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 26-08 23:15
jvdmeer schreef op 06 December 2002 @ 12:03:
[...]


Waarom niet?

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type
   TKassaRec = object
      Kassa: TGeldLa;
      Naam: string;
     public
      procedure Tonen;
   end;

procedure TKassaRec.Tonen;
begin
  writeln(Naam,Kassa.[var]
end;

var Kassas: array[0..2] of TKassaRec;

begin
  Kassas.Tonen;
end;


Wat overbodige dingen weggelaten en NIET getest.
Kleine verbeteringen:
- TKassa = class ipv TKassaRec = Object

- property Naam: String Read FString Write Fstring

en waarom een array gebruiken als je een Objectlist kan gebruiken :)

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Kassas.Tonen zal niet gaan... Kassas is een array en dus geen object. Als je dat zou willen zou je een descendant van TList kunnen maken, of zelfs van TCollection. Dat heb je zeker nodig als je een functie wilt maken die het TGeldLa object bij een naam opzoekt (of andersom).

Maar dat soort functionaliteit kun je natuurlijk ook ergens anders stallen, zodat je het simpel kan houden.

just_a_gamer: waarom zou je een property maken die geen functies gebruikt voor read/write en niet published is :?

[ Voor 15% gewijzigd door _Thanatos_ op 06-12-2002 13:42 . Reden: toevoeging ]

日本!🎌


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 26-08 23:15
_Thanatos_ schreef op 06 december 2002 @ 13:41:
Kassas.Tonen zal niet gaan... Kassas is een array en dus geen object. Als je dat zou willen zou je een descendant van TList kunnen maken, of zelfs van TCollection. Dat heb je zeker nodig als je een functie wilt maken die het TGeldLa object bij een naam opzoekt (of andersom).

Maar dat soort functionaliteit kun je natuurlijk ook ergens anders stallen, zodat je het simpel kan houden.

just_a_gamer: waarom zou je een property maken die geen functies gebruikt voor read/write en niet published is :?
Ik gebruik zelf altijd standaard properties. Gewoon zo aangeleerd. Maar als het alles binnen die object blijft dan is het misschien onnodig maar ik weet niet of hij ook een get en set functies moet schrijven. Overigens gebruik je published meestal voor componenten. Dus een property hoeft niet meteen bij published zijn. Corrigeer me maar als ik het fout heb ;)

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Ik doelde ook meer op dat het aanmaken van een property zonder read/write functies alleen zin heeft als ie published is (en dus in een component zit) omdat je em anders niet ziet... mja, is offtopic ook.

日本!🎌


Verwijderd

Topicstarter
Mensen, bedankt!
Ik had het vandaag aan de leraar gevraagd, en zijn antwoord was:

Probeer het voorlopig nog maar niet zo, dat behandelen we verderop nog wel..
Doet het nu maar op een niet zo'n nette manier...

heb ik maar een if then constructie gebruikt

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 00:49
_Thanatos_ schreef op 06 december 2002 @ 13:41:
Kassas.Tonen zal niet gaan... Kassas is een array en dus geen object. Als je dat zou willen zou je een descendant van TList kunnen maken, of zelfs van TCollection. Dat heb je zeker nodig als je een functie wilt maken die het TGeldLa object bij een naam opzoekt (of andersom).
Al is het voor de OP niet meer nodig, volgens mij moet

Kassas[0].Tonen;

gewoon werken. Een goede reden om TList of TCollection te gebruiken is de dynamische groottetoewijzing en de gemakkelijke manier van sorteren e.d. Als de grootte vooraf bekend is en je hoeft niet te sorteren, kan je volgens mij gewoon een array gebruiken. Alleen wel zorgen dat je de objecten natuurlijk netjes copnstructors en destructors aanroept.
Pagina: 1