Cum să obțineți toate legendele din formular

Cum să obțineți TOATE legendele pe formular?

Trebuie să le salvez într-un fișier în formă
<имя контрола>=<его caption>

Și apoi descărcați totul înapoi.

Se obține tipul de multilingvism.







pentru nIndex: = 0 pentru myForm.ControlCount - 1
SalvareToFile (myForm.Controls [nIndex] .Caption);

> asmith (10/12/2002 21:06)

1. Proprietatea TControl.Caption - protejată. Prin urmare, codul nu se compilează nici măcar.
2. Controlul nu se poate afla pe formular, ci, de exemplu, pe panou. Apoi nu intră în lista myForm.Controls.

Aici este necesar un pic diferit.

tip
TFriendControl = clasă (TControl);
.
pentru i: = 0 până la ComponentCount - 1
dacă componentele [i] sunt TControl atunci
cu TFriendControl (Componente [i])
dacă este subtitrare <> „“ Atunci.

> Kibitzer
Nu este necesar. membrii protejați ai clasei declarate în același modul sunt, de asemenea, disponibili.

Mulțumesc, bineînțeles, dar prezența Legendei nu este absolut necesară, iar încercarea este o soluție destul de slabă.
Am găsit un cod care verifică orice proprietate (bifată numai pentru Caption) din biblioteca IniLang.
Dacă cineva are nevoie, atunci este aici

funcția HasProperty (comp: TComponent; prop: String): boolean;
începe
rezultat: = (getPropInfo (comp.classInfo, prop)<>nil) și comp.name<>"");
se încheie;

Folosit astfel

dacă începe HasProperty (Button1, "Caption")
//.
se încheie;

Adevărul pentru componentele TNT trebuie să fie distorsionat și să se definească mai exact clasa componentelor.

var
ws: WideString;
wsl: TWideStringList;
începe
wsl: = TWideStringList.Create (zero);
//.
dacă începe HasProperty (Self.Controls [i], "Caption")
dacă Self.FindComponent (Self.Controls [i] .Name) este TTntButton apoi
începe
cu TTntButton (Self.FindComponent (Self.Controls [i] .Name)) nu
începe
wsl.Add (Self.Controls [i] .Name + "=" + Caption);
se încheie;
se încheie;
se încheie;
//.
wsl.SaveUnicode: = adevărat;
wsl.SaveToFile ("Captions.txt")
wsl.Free;

"TComponent" nu poate fi folosit. apoi Caption este citit ca șir, nu ca WideString, și toate unicode zboară nafig.

Poate fi posibil într-un mod optim? Și este necesar să descriem fiecare clasă de controale separat, dar nu mi sa părut să găsesc o clasă ca TTntControl.

> Auto.FindComponent (Self.Controls [i] .Name)
Te-ai îndoit. Nu am putut face asta.

De fapt:
Utilizați RTTI

var CompCaption: șir;

dacă are.
CompCaption: = GetPropValue (Controale [i], "Caption") // - obțineți antetul în forma AnsiString indiferent de tip.







Acest lucru va funcționa, chiar dacă unele butoane au tipul de "Caption" de Integer :)))

Faptul că sa îndoit - citiți complet :-)

Cum să obțineți / setați etichetele pe elementele de meniu după numele componentei?

Deci, de fapt, TMenuItem - descendent TComponent, în loc de TControl,
și este natural că nu este în Controls [].
Dar este în Componente [].

Dar nu l-am tăiat.

Dacă aveți nevoie de TMenuItem - trebuie să organizați
transmiteți toate componentele (mai degrabă decât comenzile):

pentru i: = 0 până la ComponentCount - 1
dacă GetPropInfo (Componente [i], "Caption") <> nil atunci
Ce este that.Add (GetPropValue (Componente [i], "Caption")));

PS De ce întotdeauna trageți Sinele?
Acest lucru are sens doar dacă aveți codul interior cu
(și nu doar cu, dar cu ceva cu aceleași proprietăți)

> prezența subtitrării în control nu este necesară


> Ei bine, cum să obțineți / setați etichetele pe elementele de meniu prin
> numele componentei?

utilizări
# 032; TypInfo;
.
S: = GetStrProp (Componente [i], "Caption");
.
SetStrProp (Componente [i], "Caption", "Close");

-)))
Completă frânează deja. E timpul să ne odihnim, să ne relaxăm, să ne odihnim.
Am încercat doar să găsesc TMenuItem în Controls [], nu în Componente [].
Și folosind rularea ComponentCount în Controls [].

2Yury Zotov:
GetStrProp care returnă tipul de rezultat? String (PChar, ShortString)?
Dacă da, nu mă va ajuta, TN TNT-componentele sunt de tip Caption WideString și toate datele vor fi pierdute, și acesta este întregul punct.

ZY Personalul meu AAAAAAAAAAAAfigennoe mulțumită dezvoltatorilor de componente TNT.

Iată implementarea programului GetStrProp

funcția GetStrProp (instanță: TObject; PropInfo: PPropInfo): șir;
începe
caz PropInfo ^ .PropType ^ .Kind de
tkString: GetShortStrPropAsLongStr (instanță, PropInfo, Rezultat);
tkLString: GetLongStrProp (instanță, PropInfo, rezultat);
tkWString: GetWideStrPropAsLongStr (instanță, PropInfo, Rezultat);
// Conversia automată de la WideString la AnsiString
altfel
Rezultat: = "";
se încheie;
se încheie;

Dacă aveți nevoie să obțineți exact WideString, atunci standard
acces la WideString sv-vă în RTTI Nu văd,
cel puțin în D5.

Doar invers: $ FE - Wirth. , $ FF este un câmp.
Și acest lucru este valabil pentru D5, pentru D6 verificați-vă singur.
(Și uita-te în typinfo - poate în D6 există deja mai mult
acces convenabil la WideString sv-you).

Și dacă aveți doar o componentă cu o astfel de Legendă
și nu mai este prevăzută -
atunci poate fi mai ușor să conduci în mod clar și să nu fiți perverși.

F-I acces la WideString sv-you pentru D5:

tip
PVMTAsArray = ^ VMTAsArray;
VMTAsArray = array [0 .. $ FFFF] de Pointer;

funcție GetWStrProp (instanță: TObject; const PropName: șir): WideString;
var PGetCode: Pointer;
Getter: TWStrGet;
Câmp: Pointer;
HiByte: Byte;
începe
PGetCode: = GetPropInfo (instanță, "W") ^. GetProc;
HiByte: = cardinal (PGetCode) shr 24;

TMethod (Getter) Datele: = instanță;
dacă HiByte = $ FF atunci
începe
Cardinal (câmp): = Cardinal (PGetCode) și $ FFFFFF + Cardinal (instanță);
Rezultat: = WideString (Câmp ^);
incheie altceva
dacă HiByte = $ FE atunci
începe
Codul TMethod (Getter)
PVMTAsArray (Instance.ClassType) [(Cardinal (PGetCode) și $ FFFFFF) div 4];
// nu un index, ci o compensare - am greșit
Rezultat: = Getter ();
capăt
altfel
începe
TMethod (Getter) Cod: = PGetCode;
Rezultat: = Getter ();
se încheie;
se încheie;

Memorie: 0,76 MB
Durată: 0,04 secunde







Articole similare

Trimiteți-le prietenilor: