Toon posts:

[Delphi] Aangemaakt object

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb hier ene probleempje die een Delphi goeroe misschien weet.

In de volgende code maak ik dynamisch een TEdit control aan en ken ik een paar properties toe. Alleen ik weet niet hoe ik het aangemaakt object kan terugkrijgen in een variabele, aangezien Self mijn form (frmMain) bevat waarop ik het TEdit control aanmaak.
code:
1
2
3
4
5
      with TEdit.Create(Self) do begin
        Name    := 'edtMijnEdit';
        Parent  := Self;
        Visible := True;
      end

In deze code wil het object die ik op dat moment aanmaak op kunnen vragen want die wil ik een een lijstje stoppen. Heeft iemand enig idee hoe ik nou aan het object frmMain.edtMijnEdit kan komen?

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 22:07

Klippy

Still Game

Parent := frmMain; toch gewoon?

Edit: toch niet, las verkeerd.

Maar wat wil je met die Edit doen? de text veranderen ofzo?

Dan ka je een algemeen event toekennen aan alle editboxen die je maakt op dat moment en aan de hand van de naam van de sender hem aanroepen.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Topicstarter
Op zaterdag 23 maart 2002 19:42 schreef LiquidSilver het volgende:
Parent := frmMain; toch gewoon?
Dat klopt. Self bevat inderdaad frmMain, maar ik moet op een of andere manier aan het net aangemaakte object kunnen komen, dus frmMain.edtMijnEdit.

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 22:07

Klippy

Still Game

Op zaterdag 23 maart 2002 19:45 schreef Aegis het volgende:

[..]

Dat klopt. Self bevat inderdaad frmMain, maar ik moet op een of andere manier aan het net aangemaakte object kunnen komen, dus frmMain.edtMijnEdit.
Zie edit :)

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Topicstarter
Ah, net bij elkaar langs gelezen. Het net aangemaakte object wil ik in een lijstje van objecten bijhouden, zoals:
code:
1
2
3
4
5
6
      with TEdit.Create(Self) do begin
        Name    := 'edtMijnEdit';
        Parent  := Self;
        Visible := True;
        MijnLijstje.Add(...) // wat moet ik hier invullen?
      end

Maar ja, ik wil dus weten wat ik op de puntjes moet invullen, namelijk het object wat ik dus aan het aanmaken ben.

Verwijderd

Dat gaat zo niet, vind ik ook jammer :)

Maar doe zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
var
  Edit: TEdit;
begin
  Edit := TEdit.Create(Self);
  with Edit do 
  begin
    Parent := Self;
    Name := 'edtMijnEdit';
    Visible := True;
    MijnLijstje.Add(Edit);
  end;
end;

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 00:18

Delphi32

Heading for the gates of Eden

DiFool heeft gelijk, je hebt een variable nodig om hem in het lijstje te kunnen stoppen.

Tip: doe in plaats van
code:
1
Edit.Name := 'edtMijnEdit';

maar
code:
1
Edit.Name := '';

Dat bespaart je de moeite van het vinden van unieke component-namen :)

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Op zaterdag 23 maart 2002 20:28 schreef DiFool het volgende:
Dat gaat zo niet, vind ik ook jammer :)

Maar doe zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
var
  Edit: TEdit;
begin
  Edit := TEdit.Create(Self);
  with Edit do 
  begin
    Parent := Self;
    Name := 'edtMijnEdit';
    Visible := True;
    MijnLijstje.Add(Edit);
  end;
end;
Zoiets
Dan moet MijnLijstje een variabele worden, zoiets als
Var MijnLijstje : Array[0..200] of TEdit; ofzo.

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
code:
1
2
3
4
5
6
7
8
9
10
11
12
var
  Edit: TEdit;
begin
  Edit := TEdit.Create(Self);
  with Edit do 
  begin
    Parent := Self;
    Name := 'edtMijnEdit';
    Visible := True;
    MijnLijstje.Add(Self);
  end;
end;

Self is een pointer naar het object zelf. Dus, als je Self gebruikt in een With-clause is Self in dit geval Edit.

Als je buiten uw with clause die Add doet, dan kun je
code:
1
MijnLijstje.Add(Edit)

doen.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Op zondag 24 maart 2002 01:14 schreef XLerator het volgende:

Dan moet MijnLijstje een variabele worden, zoiets als
Var MijnLijstje : Array[0..200] of TEdit; ofzo.
Ik denk dat het het best is , dat MijnLijstje een TObjectList is.

https://fgheysels.github.io/


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Is een TList geen goede lijst om die edit's in te stoppen?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Jawel hoor. Een TObjectList is gewoon een TList, maar met wat extra handigheidjes. Zo kan 'ie bv. de objecten zelf destroyen wanneer 'ie zelf gefreed wordt of wanneer er items uit de list worden verwijderd. En z'n Items[] worden automatisch gecast naar TObject i.p.v. naar Pointer.

Een TComponentList gaat nog wat verder, en kan bv. ook zelf nog de FreeNotifications afhandelen.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Cool, ik gebruikte altijd TList en dan gewoon alles zelf doen zoals TObject(TList.Item[x]). Maar dat klinkt idd ook wel leuk. Zal er zeker es naar kijken. Thanks.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

whoami:
Self is een pointer naar het object zelf. Dus, als je Self gebruikt in een With-clause is Self in dit geval Edit.
Dat klopt niet.

Delphi help:
Within the implementation of a method, the identifier Self references the object in which the method is called.
Je zou anders ook een probleem hebben als je meerdere objecten in je with statement zou hebben.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Ieder object heeft een member Self in Object Pascal. Deze pointer wijst naar het object zelf, net als de this pointer in C++/C#.
Als je dus in een member-functie van self gebruikt, dan bedoel je hiermee het object waarop deze member-functie uitgevoerd wordt.
Als je in een with-clausule 'Self' gebruikt, dan staat Self voor het object waarop deze member uitgevoerd wordt, en niet voor het object dat in de with - clausule gebruikt wordt.
Als je nu volgende code hebt:
code:
1
2
3
4
5
6
procedure TForm1.OnButton1Click(object Sender)
begin
  With Edit1 do begin
     Self.Name := "test";
  end;
end;

Dan slaat die Self hier niet op 'Edit1', maar op de instance van TForm1 die hier van toepassing is. Als je dus meerdere objecten gebruikt in uw with - clause en je gebruikt Self in uw with - clause zul je nooit problemen hebben.

https://fgheysels.github.io/


Verwijderd

Eh, zeggen we nou hetzelfde :? Volgens mij wel, he :)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Maar is het niet logischer dat Self op het eerst volgende bovenliggend object wijst. Dus als Self in een with staat dat hij dat object pakt.

"The shell stopped unexpectedly and Explorer.exe was restarted."

Pagina: 1