[Delphi6] Dynamisch een label component aanroepen.

Pagina: 1
Acties:

  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
Ik heb een functie waarmee ik de naam van een component genereer:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function veranderLabel(welkNummer: Integer; welkeKleur: Integer; welkePlaats: Integer): Integer;

var SwelkNummer : string;
    SwelkeKleur : string;
    Slabel : string;

begin

   case welkNummer of
     0: SwelkNummer := 'Negen';
     1: SwelkNummer := 'Tien';
   end;

   case welkeKleur of
     0: SwelkeKleur := 'Rood';
     1: SwelkeKleur := 'Groen';
     2: SwelkeKleur := 'Blauw';
     3: SwelkeKleur := 'Paars';
   end;

   Slabel := 'lbl' + IntToStr(welkePlaats) + SwelkeKleur + SwelkNummer;
   frmLabels.Slabel.Caption := 'Testje';
   frmLabels.Slabel.Enabled := TRUE;
   Result:= 1;
end;


Nu is het de bedoeling dat de naam van het component wat aangeroepen wordt, gemaakt wordt door middel van de meegegeven parameters. Dit lukt, maar hoe zet je dan de variabele 'Slabel' in de syntax.

Delphi zegt nu dat hij frmLabels.Slabel niet kent.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:25
tuurlijk ken hij frmLabels.Slabel niet. SLabel is nl. de naam van een variable die de naam van uw label bevat.

Wat je kunt doen, is alle controls die op uw form staan overlopen en kijken welkeen overeenkomt met de inhoud van die string:

code:
1
2
3
4
5
6
7
8
9
10
11
12
var
  Indx : Integer;
begin
  for Indx := 0 to Self.ControlCount do begin
    if Self.Controls[i] is TLabel then begin
       if TLabel(Self.Controls[i]).Name = SLabel then begin
           TLabel(Self.Controls[i]).Caption := 'Testje';
           TLabel(Self.Controls[i]).Enabled := True;
       end;
    end;
  end;
end;



Maar, je hebt ook een functie FindComponent die een string als parameter nodig heeft. Die string bevat de naam van uw component en returned een TComponent:
code:
1
2
3
4
5
6
7
var
   MyLabel : TLabel;
   SLabel   : string;
begin
   SLabel := 'lblLabel2';
   MyLabel := Self.FindComponent (SLabel);
end;

[ Voor 22% gewijzigd door whoami op 27-12-2002 16:28 ]

https://fgheysels.github.io/


  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
Is er niet een mogelijkheid om zoiets te doen:

code:
1
frmLabels.%Slabel%.Enabled := TRUE;

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:25
evaarties schreef op 27 december 2002 @ 16:48:
Is er niet een mogelijkheid om zoiets te doen:

code:
1
frmLabels.%Slabel%.Enabled := TRUE;


Neen.
De (afaik) enige manieren om het te verwezenlijken, heb ik in m'n post hierboven gezet.
Delphi is een compiled language, en geen scripttaal.

(Waarom wil je het perse trouwens zo doen?), is die FindComponent geen goeie manier? Die geeft gewoon het TComponent terug die de naam heeft die je als parameter had meegegeven.

https://fgheysels.github.io/


  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
ik krijg bij FindComponent de volgende fout:

Undeclared Identifier 'FindComponent'

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:25
Hmm.... Post eens die regel code waar je FindComponent in gebruikt?
Ik gebruik Delphi 5.
code:
1
Self.FindComponent('compnaam');

Zou toch moeten werken veronderstel ik....

https://fgheysels.github.io/


  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
met Self werkt het blijkbaar niet bij mij, wel nu ik de naam van het formulier gebruik. Kom ws doordat ik in een functie zit.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:25
evaarties schreef op 27 december 2002 @ 17:01:
met Self werkt het blijkbaar niet bij mij, wel nu ik de naam van het formulier gebruik. Kom ws doordat ik in een functie zit.


't Is te zien of die functie een member-functie is van je form of niet. Indien die functie een member-functie is van je form, zou het moeten werken met Self.

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

whoami: Is het niet. Hij gebruikt een losse functie.
evaarties: Probeer eens
Delphi:
1
2
3
4
5
6
7
8
9
var Component: TComponent;
      Label: TLabel;
begin
  Component := frmLabels.FindComponent(SLabel);
  if Assigned(Component) and (Component is TLabel) then begin
    Label := Component as TLabel;
    // Pas hier heb je veilig en zeker een TLabel met de naam SLabel...
  end;  
end;


Maar waarom voeg je deze functie niet toe aan je TfrmLabels? Dan kan je die Self gebruiken (of gewoon weglaten). Het is veel netter en je bent nog veiliger uit ook zonder die globale variable frmLabels.

We adore chaos because we like to restore order - M.C. Escher


  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
Het is gelukt, LordLarry jouw stuk maakte alles duidelijk.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:25
[nohtml]
LordLarry schreef op 27 december 2002 @ 17:19:
whoami: Is het niet. Hij gebruikt een losse functie.
Mjah, ook net gezien.

Die Assigned en 'is' test was ik nog vergeten. Die doe je ook best vooraleer je dat label dan gaat gaan aanpassen. Defensief programmeren heet dat.

Wat is eigenlijk het verschil in
code:
1
MyLabel = FoundComponent as TLabel;

en
code:
1
MyLabel = TLabel(FoundComponent)

?

[ Voor 18% gewijzigd door whoami op 27-12-2002 17:26 ]

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dit is een zgn harde typecast
Delphi:
1
MyLabel = TLabel(FoundComponent);

De compiler gaat er hierbij van uit dat de programmeur het wel beter weet en doet wat er gevraagt wordt zonder te controleren of het wel zinnig is. Deze regel gaat altijd goed, zelfs het benaderen van de variable MyLabel gaat soms nog zonder fouten (alhoewel het niet zinnig is). Als het echt fout gaat knalt ie eruit met een memory exception ergens.

Bij
Delphi:
1
MyLabel = FoundComponent as TLabel;

wordt er nog extra gecontroleerd of het echt wel zinnig is. Zoniet dan gooit ie meteen op deze regel een exceptie dat het niet kan. Iets veiliger dus. Eigenlijk staat er zoiets:
Delphi:
1
2
3
4
if MyLabel is TLabel then
  MyLabel = TLabel(FoundComponent)
else
  // Gooi exception

Het is dus een beetje dubbelop met de gehele code die ik eerst gaf, maar better safe then sorry

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1