Autor Beitrag
Natti
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
Procedure uebersetzen(xform: Tform);					


Zuletzt bearbeitet von Natti am Do 18.09.03 08:44, insgesamt 1-mal bearbeitet
G-man
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 258

Win 2000, Win ME, SuSE 8.2
D5 Standard, D6 Professional
BeitragVerfasst: Do 18.09.03 08:37 
Probiers mal mit Length()...

_________________
...To err is human, but to really foul things up requires a computer.
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Do 18.09.03 11:22 
oder so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if xyz.caption='' then
//keine caption
else
//caption vorhanden


kommt aber aufs selbe raus...

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Do 18.09.03 12:06 
FieldAddress gibt Pointer zurück.
Ich hab damit noch nie was gemacht :oops: .
Wie kann ich dann auf die Eigenschaften zugreifen?
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 18.09.03 12:54 
Warum so kompliziert...? :roll:

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 Suche in: Delphi-Forum, Delphi-Library 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)...! 8) :)

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Natti Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Do 18.09.03 13:03 
Ich hab schon so probiert:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Do 18.09.03 13:36 
Motzi: Ich danke dir!

Es scheint zu funktionieren! :lol: :beer:
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 18.09.03 15:05 
@Udontknow: also bei mir hat TOpenDialog keine Caption Eigenschaft..! :roll: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 18.09.03 17:25 
man könnte auch resourcestrings anlgen, dann bräuchte man die exe nicht mal neuzukompilieren :wink:

_________________
mfg.
mâximôv
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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. :wink:

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



BeitragVerfasst: 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)

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

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

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

ausblenden 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



BeitragVerfasst: Sa 20.09.03 11:15 
Ach ja, alle Stringeigenschaften herausfinden:

ausblenden 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
BeitragVerfasst: 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