|
| 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
| |
|
|