| Autor |
Beitrag |
Natti
      
Beiträge: 50
|
Verfasst: Do 18.09.03 08:35
Hallo!
Ich möchte bei alle Elemente, die sich auf einem Form befinden und Eigenschaft "Caption" haben, diese Eigenschaft ändern (z.B. in andere Sprache übersetzen). Wie kann ich ermitteln, ob ein Element Caption-Eigenschaft hat? Und wie kann ich dann die ersetzen?
Die Funktion bzw. Procedure soll für alle Formen im Programm funktionieren.
z.B.
Delphi-Quelltext 1:
| Procedure uebersetzen(xform: Tform); |
Zuletzt bearbeitet von Natti am Do 18.09.03 08:44, insgesamt 1-mal bearbeitet
|
|
G-man
      
Beiträge: 258
Win 2000, Win ME, SuSE 8.2
D5 Standard, D6 Professional
|
Verfasst: Do 18.09.03 08:37
Probiers mal mit Length()...
_________________ ...To err is human, but to really foul things up requires a computer.
|
|
patrick
      
Beiträge: 1481
WIN2k, WIN XP
D6 Personal, D2005 PE
|
Verfasst: Do 18.09.03 11:22
oder so:
Delphi-Quelltext 1: 2: 3: 4:
| if xyz.caption='' then else |
kommt aber aufs selbe raus...
_________________ Patrick
im zweifelsfall immer das richtige tun!!!
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 18.09.03 11:40
Hi!
Ich glaube, hier wird ein wenig aneinander vorbei geredet. Es geht darum, wie man erkennen kann, ob eine Komponente eine Caption-Eigenschaft hat oder nicht, es geht nicht darum, ob sie leer ist.
Grundsätzlich erkennst du es natürlich an der Klasse des Objekts. Wenn Objekt. InheritsFrom(TButton) True zurückgibt, hat dieses Objekt eine Caption-Eigenschaft, die du mit TButton(Objekt).Caption auslesen und ändern kannst.
Dafür musst du natürlich sämtliche in Frage kommenden Klassen parat haben. Sind die nicht bekannt, gibt es evtl noch eine Möglichkeit: Irgendwo meine ich gelesen zu haben, das man zumindest published properties eines Objekts zur Laufzeit auslesen kann, sobald ich was rausfinde, melde ich mich noch mal...
Cu,
Udontknow
|
|
barfuesser
      
Beiträge: 324
|
Verfasst: Do 18.09.03 11:56
Die Published Properties kann man mit FieldAddress abfragen. FieldAddress ist eine Funktion von TObject. Als Rückgabewert erhält man die Addresse der Property und wenn diese nicht vorhanden ist nil.
barfuesser
|
|
Natti 
      
Beiträge: 50
|
Verfasst: Do 18.09.03 12:06
FieldAddress gibt Pointer zurück.
Ich hab damit noch nie was gemacht  .
Wie kann ich dann auf die Eigenschaften zugreifen?
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 18.09.03 12:54
Warum so kompliziert...?
Die Eigenschaft Caption wurde mit dem TControl-Objekt eingeführt... man kann also einfach auf "is TControl" prüfen...
Und mit den Eigenschaften Controls und CONTROLCOUNT ist das Auflisten aller Child-Controls eines TWinControls auch kein Problem mehr (hier kann man sich dann auch noch die "is TControl"-Prüfung sparen)...! 
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Natti 
      
Beiträge: 50
|
Verfasst: Do 18.09.03 13:03
Ich hab schon so probiert:
Delphi-Quelltext 1: 2:
| for i:=0 to xform.ControlCount-1 do (xform.controls[i] as TControl).caption:='Test'; |
Kommt immer Fehler:
| Zitat: | | Undefinierter Bezeichner: 'caption' |
Was fehlt noch?
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 18.09.03 13:19
Das liegt daran, dass die Eigenschaft Caption in TControl noch als protected deklariert ist. Abhilfe schafft einfach folgender Trick:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| type THookControl = class(TControl) public property Caption; end;
for i := 0 to xForm.ControlCount - 1 do THookControl(xForm.Controls[i]).Caption := 'Test'; |
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Natti 
      
Beiträge: 50
|
Verfasst: Do 18.09.03 13:36
Motzi: Ich danke dir!
Es scheint zu funktionieren! 
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 18.09.03 13:36
@Motzi:
Es könnte Komponenten geben, die nicht von TControl abstammen (z.B. alle nichtvisuellen Komponenten wie TOpenDialog), jedoch eine Eigenschaft "Caption" selber implementieren. Daher mein Hinweis, daß man dann alle in Frage kommenden Klassen berücksichtigen muss.
Die Eigenschaft Controls durchzugehen, könnte unter Umständen also nicht reichen. Unwahrscheinlich, aber möglich.
Cu,
Udontknow
|
|
ShadowThief
      
Beiträge: 278
|
Verfasst: Do 18.09.03 13:50
jetzt aber nochmal was anderes:
was ist die eleganteste lösung, um ein mehrsprachiges tool zu schreiben?
ich kann mich da dunkel an vb-zeiten zurückerinnern, wo man so
sprach-dateien hatte, und die dann irgendwie verknüpft hat, herrje ist
das lang her ...
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 18.09.03 15:05
@Udontknow: also bei mir hat TOpenDialog keine Caption Eigenschaft..!  nur eine Eigenschaft "Title"
Genausowenig haben die andren VCL-Objekte die nicht von TControl sondern "nur" von TComponent abstammen eine Eigenscaft Caption (zumindest ist mir nichts derartiges bekannt...)!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Do 18.09.03 15:27
| ShadowThief hat folgendes geschrieben: | | was ist die eleganteste lösung, um ein mehrsprachiges tool zu schreiben? |
Ob es Elegant ist weiß ich nicht aber ich mache es so das ich jeden Text der in der Anwendung vorkommt zum Beispiel im FormCreate im Quelltext einer Konstante zuweise:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.CreateEvent ; begin Caption := cLngFormCaption; btnOk.Caption := cLngOk; btnCancel.Caption := cLngCancel; End; |
Die Konstanten sind bei mir in der Datei PrgTexte.pas definiert. Die Konstanten sind nicht wirklich in der PrgTexte.pas definiert sondern es wird eine Datei per Include benutzt. Mit Hilfe von Conditional Defines lege ich die Sprache fest.
Gruß
Tino
Gruß
Tino
|
|
ShadowThief
      
Beiträge: 278
|
Verfasst: Do 18.09.03 17:00
ja das ist eine lösung,
dann kann man ja das ganze programm normal in seiner sprache
entwickeln und wenn man fertig ist, dann ersetzt man einfach
beim starten des programms alle texte.
keine schlechte idee.
shadow.
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Do 18.09.03 17:25
man könnte auch resourcestrings anlgen, dann bräuchte man die exe nicht mal neuzukompilieren 
_________________ mfg.
mâximôv
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 18.09.03 17:53
@Motzi: Das Beispiel Opendialog bezog sich nur auf Komponenten auf Formularen, die keine TControl-Nachfahren sind.
Nur weil du keine Komponenten mit Caption-Eigenschaft kennst, kann es ja trotzdem solche Komponenten geben. Ich sprach ja eben von Möglichkeiten.
BTW: Bei Übersetzungen reicht es z.B. nicht aus, alle Caption-Einträge zu ändern. Bei TOpenDialog fällt da z.B. die Beschreibung der Dateien an, bei Datasets z.B. Displayformate usw.. Eine Aufschlüsselung nach einzelnen Klassen wird also wohl nötig sein.
Cu,
Udontknow
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 20.09.03 11:11
Vor einiger Zeit hab ich mal was in dieser Richtung programmiert. Ich glaube das wird dir weiterhelfen.
Ich weiß aber nicht ob es mit allen Delphi-Versionen geht.
1. "TypInfo" Einbinden
2. Hiermit die Eigenschaft setzen (das ist aber nur empfehlenswert wenn du sicher bist dass die Eigenschaft existiert)
Delphi-Quelltext 1: 2: 3: 4:
| procedure SetCaptionProp(instance: TObject; value: string); begin SetPropValue(instance,'Caption',value); end; |
Wenn du herausfinden willst ob ein Objekt eine Bestimmt Eigenschaft hat, kannst du das so machen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function IsPropAvailable(instance: TObject; name: string): boolean; var x: tPropList; i,j: integer; begin result := false; j:= GetPropList(PTypeInfo(instance.ClassInfo), [tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString, tkVariant, tkArray, tkRecord, tkInterface, tkInt64, tkDynArray], @x, false); for i := 0 to j-1 do if uppercase(x[i].Name) = uppercase(name) then begin result := true; exit; end; end; |
und für Sicheres Setzen der Eigenschaft nimmst du dann hierdas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| function SetCaptionSave(instance: TObject; value: string): boolean; begin result := true; if IsPropAvailable(instance, 'caption') then SetPropValue(instance,'caption',value) else result := false; end; |
und um irgendeine Eigenschaft zu setzen das:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| function SetPropertySave(instance: TObject; prop: string; value: variant): boolean; begin result := true; if IsPropAvailable(instance, prop) then SetPropValue(instance, prop, value) else result := false; end; |
Zuletzt bearbeitet von obbschtkuche am Sa 20.09.03 11:34, insgesamt 2-mal bearbeitet
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 20.09.03 11:15
Ach ja, alle Stringeigenschaften herausfinden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TStringArray = array of string;
...
function GetStringProps(instance: TObject): TStringArray; var j: integer; x: TPropList; begin j:= GetPropList(PTypeInfo(TButton.ClassInfo), [tkString, tkWChar, tkLString, tkWString], @x, false); setlength(result, j); for j := 0 to length(result)-1 do result[j] := x[j].Name; end; |
das geht auch mit allen anderen Typen.
|
|
DaWalt
Hält's aus hier
Beiträge: 4
Win 2000, Mac OSX
D7 Enter
|
Verfasst: Fr 26.11.04 07:48
Titel: Wo sind die Designzeit -Inhalte einer Caption gespeichert?
Hallo Leute, ich hänge mich hier mal dran, weils zu meinem Thema 'Übersetzen' paßt und dieser Thread auch schon ein paar Fragen beantwortet hat.
Meine Frage wäre noch, wie man zur Laufzeit herausbekommt, welcher String zur Designzeit in die Caption eingetragen war, nachdem man diese zur Laufzeit schon mal verändert hat. Wenn also z.B. für ein Label.Caption 'Druckansicht' im Objektinspektor eingetragen ist, ich dies zur Laufzeit in 'Printview' ändere, wie finde ich heraus, dass 'Druckansicht' eingetragen war? Muß doch irgendwo gespeichert sein!
Vielen Dank,
DaWalt
|
|