/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Caption på en knap
Fra : Esben Piltoft


Dato : 23-10-02 20:42

Jeg har en stump kode der har drillet mig gennem længere tid. Jeg har
en form med knapper og labels (og andre ting med captions) på, og jeg
vil gerne gennemløbe dem alle, og vise navn og caption på
komponenterne.

Og her går det hele i sort. Jeg kan godt vise navne på komponenterne,
men jeg kan ikke finde ud af at få vist komponenternes caption.
Kompileren vil ikke acceptere min kode (linien med itsCaption). Har
også prøvet mange andre ting, men med samme resultat...

Men det må vel kunne lade sig gøre (har spurgt flere steder, men de
har heller ikke haft nogen ide om hvordan man gør det).

Hvis der er nogen der har en løsning, vl jeg være meget taknemmelig!
:)

På forhånd tak

//*********************** 8< kode 8< ***************
procedure TForm1.btnTestingClick(Sender: TObject);
var
I: Integer;
Temp: TComponent;
komponentnavn: string;
klassenavn : shortstring;
ClassRef: TClass;
itsCaption : String;
begin
for I := ComponentCount - 1 downto 0 do
begin
Temp := Components[I];

klassenavn := Temp.ClassName;
komponentnavn := Temp.Name;
ClassRef := Temp.ClassType;


//men ville f.eks. gerne kunne gøre det på en måde, så det
//virker med flere komponenter. Næste linie virker ikke
itsCaption := ClassRef(FindComponent(komponentnavn)).Caption;

ShowMessage('ClassName:' + klassenavn + #13 +
'Name:' + komponentnavn + #13 +
'Caption:' + itsCaption);
end;
end;

 
 
Harald (24-10-2002)
Kommentar
Fra : Harald


Dato : 24-10-02 19:50

"Esben Piltoft" <synonym@sol.dk> skrev i en meddelelse
news:5aef858a.0210231141.ed9572d@posting.google.com...
> Jeg har en stump kode der har drillet mig gennem længere tid. Jeg har
> en form med knapper og labels (og andre ting med captions) på, og jeg
> vil gerne gennemløbe dem alle, og vise navn og caption på
> komponenterne.
>
> Og her går det hele i sort. Jeg kan godt vise navne på komponenterne,
> men jeg kan ikke finde ud af at få vist komponenternes caption.
> Kompileren vil ikke acceptere min kode (linien med itsCaption). Har
> også prøvet mange andre ting, men med samme resultat...
>
> Men det må vel kunne lade sig gøre (har spurgt flere steder, men de
> har heller ikke haft nogen ide om hvordan man gør det).
>
> Hvis der er nogen der har en løsning, vl jeg være meget taknemmelig!
> :)
>
> På forhånd tak
>
> //*********************** 8< kode 8< ***************
> procedure TForm1.btnTestingClick(Sender: TObject);
> var
> I: Integer;
> Temp: TComponent;
> komponentnavn: string;
> klassenavn : shortstring;
> ClassRef: TClass;
> itsCaption : String;
> begin
> for I := ComponentCount - 1 downto 0 do
> begin
> Temp := Components[I];
>
> klassenavn := Temp.ClassName;
> komponentnavn := Temp.Name;
> ClassRef := Temp.ClassType;
>
>
> //men ville f.eks. gerne kunne gøre det på en måde, så det
> //virker med flere komponenter. Næste linie virker ikke
> itsCaption := ClassRef(FindComponent(komponentnavn)).Caption;
>
> ShowMessage('ClassName:' + klassenavn + #13 +
> 'Name:' + komponentnavn + #13 +
> 'Caption:' + itsCaption);
> end;
> end;

Hvad med bare at typecaste din Temp til en TLabel, det er måske ikke så pænt
men det virker, men så skal Temp lige laves om til en TControl for at undgå
fejl hvis der er andet end Labels, buttons osv. på formen. Så den samlede
ændring ser således ud:

var
I: Integer;
Temp: TControl;
komponentnavn: string;
klassenavn : shortstring;
ClassRef: TClass;
itsCaption : String;
begin
for I :=ControlCount - 1 downto 0 do
begin
Temp :=Controls[I];

klassenavn := Temp.ClassName;
komponentnavn := Temp.Name;
ClassRef := Temp.ClassType;

itsCaption:=TLabel(temp).Caption; // her typecastes til TLabel

ShowMessage('ClassName:' + klassenavn + #13 +
'Name:' + komponentnavn + #13 +
'Caption:' + itsCaption);
end;
end;

Mvh
HK



Thomas Due (25-10-2002)
Kommentar
Fra : Thomas Due


Dato : 25-10-02 09:36

> Jeg har en stump kode der har drillet mig gennem længere tid. Jeg har
> en form med knapper og labels (og andre ting med captions) på, og jeg
> vil gerne gennemløbe dem alle, og vise navn og caption på
> komponenterne.
[SNIP]

Harald har en udemærket løsning i sit svar, men det lider under det problem
at du skal ind og checke på klassen for hver enkelt komponent, du skal
checke om det er en TLabel, TButton, TGroup osv. Det fylder forfærdentlig i
koden.
Du skal i stedet for anvende den RTTI (RunTime Type Information) der
automatisk følger med, og som forøvrigt bliver brugt at delphi selv til
bl.a. at fylde værdier i "Object Inspector" vinduet.

Følgende eksempel fylder Name, ClassName, ParentName, Caption og Text
værdierne ind i et StringGrid. Dette gøres for caption og text ved at udlæse
RTTI information. "TypInfo" skal tilføjes til Uses klausulen.

// ----------------------------------------------------------------
// START EKSEMPEL
// ----------------------------------------------------------------
// AParent er i dette tilfælde Form1.
// ----------------------------------------------------------------
procedure TForm1.FindControls(AParent: TWinControl);
var
idx : Integer;
cnt : Integer;
tmp : TControl;

// Det er her magien sker. Denne funktion henter værdien for en string
property ud fra
// den angivne komponent.
function GetStringPropertyValue(Const AComponent : TControl; Const
AProperty : String) : String;
var
prp : PPropInfo;
begin
prp := GetPropInfo(AComponent.ClassInfo, AProperty);
if assigned(prp) then
Result := GetStrProp(AComponent, prp)
else
Result := '';
end;
begin
cnt := AParent.ComponentCount;

for idx := 0 to cnt - 1 do
begin
tmp := TControl(AParent.Components[idx]);
grdNames.RowCount := grdNames.RowCount + 1;
grdNames.Cells[0, idx+1] := tmp.ClassName;
grdNames.Cells[1, idx+1] := tmp.Name;
grdNames.Cells[2, idx+1] := tmp.Parent.Name;
grdNames.Cells[3, idx+1] := GetStringPropertyValue(tmp, 'Caption');
grdNames.Cells[4, idx+1] := GetStringPropertyValue(tmp, 'Text');
end;
end;

Proceduren kan sagtens tåle noget mere arbejde, men den viser det
grundlæggende i hvordan man henter RTTI ud fra en komponent.

--
Thomas Due
Software Developer
Scanvaegt Nordic A/S



Harald (25-10-2002)
Kommentar
Fra : Harald


Dato : 25-10-02 12:19

"Thomas Due" <t.due@scanvaegt_REMOVE_.dk> skrev i en meddelelse
news:apavqe$jqk$1@sunsite.dk...
> > Jeg har en stump kode der har drillet mig gennem længere tid. Jeg har
> > en form med knapper og labels (og andre ting med captions) på, og jeg
> > vil gerne gennemløbe dem alle, og vise navn og caption på
> > komponenterne.
> [SNIP]
>
> Harald har en udemærket løsning i sit svar, men det lider under det
problem
> at du skal ind og checke på klassen for hver enkelt komponent, du skal
> checke om det er en TLabel, TButton, TGroup osv. Det fylder forfærdentlig
i
> koden.

Som jeg skrev så var det nok ikke særligt pænt at gøre det på den måde og
grunden til at jeg mente det var nettop at der ikke blev checket for om det
var en TLabel, TButton, TGroup osv, men det virker jo fint alligevel.

Mvh
HK



Esben Piltoft (26-10-2002)
Kommentar
Fra : Esben Piltoft


Dato : 26-10-02 10:40

Jeg takker mange gange for begge svar.
Jeg vil nok bruge den letteste løsning lige nu, men jeg har allerede
planer for den mere omfattende løsning (med stringgrid og det hele).
Før havde jeg bare smidt det hele i en ini-fil, men det er lidt mere
gennemført at sende det forbi en stringgrid først, og lave sine
rettelser der, i stedet for at skulle ud med en teksteditor bagefter.

Så igen tak! :)
Esben

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste