![]() |
Dem Typ TObject eine Property hinzufügen
Hallo.
Ich hätte da ein kleines Problem. Und zwar verwende ich in jedem meiner Programme die Eigenschaft Tag um Proceduren von Komponenten zu bündeln, sodass ich nicht tausende Proceduren in meinem Units habe. Nun habe ich aber einen interessanten Artikel gelesen, wie man eine Anwendung mehrsprachig gestalten kann, allerdings benötigt man dazu die Tag-Eigenschaft. Nun habe ich die Frage, ob man dem Typen TComponent um eine Eigenschaft wie LanguageTag (bzw. in der FLanguageTag) erweitern kann, sodass diese Eigenschaft bei JEDER verfügbaren Komponente die ich verwende sichtbar und nutzbar ist! Ich habe das schon mal getestet nur war ich bisher noch nicht erfolgreich. Ich denke ich muss erst ads Package, in dem die Classes-Unit steckt compilieren, nur wie?! Vielen Dank schon mal für eure Antworten :) mfg armin |
Re: Dem Typ TObject eine Property hinzufügen
Alternativ könntest du im Tag den Tag zweitteilen wenn du nich die kompletten 4 Byte brauchst...
Ich denke da an sowas wie HighWord = Sprache LowWord = Das was du vorhast so könntest du die Zahlen 3 und 21 einfach so Umwandeln: 3 => 00000000 00000011 21 => 00000000 00010101 3 + 21 => 00000000 00000011 00000000 00010101 => 196629 Oder Auch:
Delphi-Quellcode:
Oder du kompilierst eben TComponent bzw TObject neu...
Sprache := blub.Tag and $FFFF0000;
RestTag := blub.Tag and $0000FFFF; allerdings kannst du dann davon ausgehen das einige Komponenten von denen du den Quelltext nicht hast sondern nur die DCU's nicht mehr laufen! Nur noch eine Frage was machst du mit deinem Tag atm? wenn ich dich richtig verstanden habe kann man das auch anders lösen! Greetz Boombuler |
Re: Dem Typ TObject eine Property hinzufügen
du kannst auch einfach eine objektreferenz oder einen pointer auf ein record in dem tag ablegen:
Delphi-Quellcode:
var
SomeThing: TSomeThing; Data1: PDataRec; Data2: TDataClass; // ... New(Data1); Data1^.Language := 'Deutsch'; SomeThing.Tag := Integer(Data1); // ... PDataRec(SomeThing.Tag)^.Language; // bzw Data2 := TDataClass.Create; Data2.Language := 'Deutsch'; SomeThing.Tag := Integer(Data2); // ... TDataClass(SomeThing.Tag).Language; |
Re: Dem Typ TObject eine Property hinzufügen
@Boombuler:
Dass manche Komponenten dann nicht mehr funktionieren hab ich mir fast gedacht, daher hab ich bisher auch nur ein "bisschen" getestet und nicht zu sehr in die Units eingegriffen. Was ich im Moment mit dem Tag anstelle: Und zwar hab ich zum Bleistift 10 MainMenu Einträge. Jeder Eintrag bekommt einen unterschiedlichen Tag zugewiesen, also von 0-9. Dann schreibe ich eine Procedure, die bei den OnClicks der 10 Einträge ausgeführt wird und frage dann per case-Anweisung ab, um welches Item es sich handelt, also wie folgt:
Delphi-Quellcode:
Was du mit dem HighWord und LowWord meinst, weiß ich bisher zwar noch nicht, aber ich werd mich dieser Sache mal genauer annehmen...
procedure TForm1.MainMenuTestClick(Sender: TObject);
begin case (Sender as TMenuItem).Tag of 0: { OnClick beim ersten Eintrag } begin // Do Anthing end; 1: { OnClick beim zweiten Eintrag } begin // Do Anthing end; // etc.. end; end; @Frickeldrecktuxer_TM: Hm.. hatte mit Pointer bisher noch nie wirklich viel am Hut, hätte auch gedacht, dass das vielleicht etwas einfacher geht. Finde deine Lösung etwas kompliziert, vor allem weil ich verdammt viele Komponenten auf meiner Form habe! |
Re: Dem Typ TObject eine Property hinzufügen
Deine Aktion mit den Prozeduren könntest du auch so abfragen:
Delphi-Quellcode:
procedure TForm1.MainMenuTestClick(Sender: TObject);
begin If (Sender as TMenuItem) = MenuEintrag1 then begin // Do Anything end else If (Sender as TMenuItem) = MenuEintrag2 then begin // Do Anything else end; end; |
Re: Dem Typ TObject eine Property hinzufügen
Ja, das weiß ich, hatte ich auch schon mal gemacht, finde es aber einfacher, das über meine Case-Anweisung zu machen. Vor allem ist das nicht so viel zum schreiben! Daher suche ich ja nach einer Alternativen Lösung zu meinem Problem. Hatte auch schon mal an vorher angelegt Konstanten gedacht, aber das macht die Sache auch nur noch schwieriger zu verwalten... Daher war meine eigentliche Idee einen zweiten "Tag" (d.h. eine weitere Eigenschaft) einzuführen.
Nachdem das im Allgemeinen aber nicht so einfach geht wie ich mir das gedacht habe, werde ich mir wohl etwas anderes einfallen lassen müssen, aber über weitere Hinweise wäre ich sehr erfreut! mfg armin |
Re: Dem Typ TObject eine Property hinzufügen
Wie gesagt guck dir das mit dem Hi und Lo Word an!
Dabei teilst du einfach deinen Tag in 2 Teile...
Delphi-Quellcode:
Die einizge Bedingung dabei ist eben, dass du bei keiner der Zahlen den Wert 65535 überschreitest!
Function GenerateTag(SprachCode, OrginalTag:Word):Integer;
begin result := (SprachCode shl 16) + OrginalTag; end; function GetOrginalTag(aComponent:TComponent):Integer; begin result := aComponent.Tag and $0000FFFF; end; function GetSprachCode(aComponent:TComponent):Integer; begin result := aComponent.Tag and $FFFF0000; end; Greetz Boombuler |
Re: Dem Typ TObject eine Property hinzufügen
Kleiner Fehler:
Delphi-Quellcode:
function GetSprachCode(aComponent:TComponent):Integer;
begin result := (aComponent.Tag and $FFFF0000) shr 16; end; |
Re: Dem Typ TObject eine Property hinzufügen
Ups :oops:
Ich wusste ich hab was vergessen ;) Greetz Boombuler |
Re: Dem Typ TObject eine Property hinzufügen
Zitat:
|
Re: Dem Typ TObject eine Property hinzufügen
Für mehrsprachige Anwendungen würde ich GNUGetText verwenden, da hat sich dann jemand die Mühe schonmal gemacht.
|
Re: Dem Typ TObject eine Property hinzufügen
Hallo,
ungetestet:
Delphi-Quellcode:
Sollte eigentlich funktionieren :)
type
TObjectHelper = class helper for TObject public LanguageIndex: Integer; end; Greetz alcaeus |
Re: Dem Typ TObject eine Property hinzufügen
Zitat:
![]() |
Re: Dem Typ TObject eine Property hinzufügen
Zitat:
[Edit]In meiner Delphi-Hilfe habe ich das hier gefunden Zitat:
[/Edit] |
Re: Dem Typ TObject eine Property hinzufügen
Die class helpers funktionieren auch in Delphi 2005 bereits mit Win32, allerdings erst in Delphi 2006 offiziell. Und die Deklaration kommt genau dahin, wo eine Klassendeklaration mit type normal hinkommt, je nach Sichtbarkeit in den interface oder implementation-Bereich der Unit ;)
Greetz alcaeus |
Re: Dem Typ TObject eine Property hinzufügen
Tut mir leid wenn ich mich nun ein bisschen blöd anstelle, aber es geht leider nicht. Irgendwie weiß ich auch nicht wie ich es anwenden soll und vor allem wo genau. Ich hab ja mein Haupt-Unit, von mir aus Unit1. Daneben hab ich mehrere andere Units. Um nun TObject zu erweitern muss ich den Code wo hin kopieren?! In die Classes-Unit ist ja nicht sinn und Zweck oder?!
Wenn ich das ganze in meine Unit1 kopieren, dann erscheint folgender Fehler (mit Delphi 2005 Architect). Der Cursor bleibt dann hinter LanguageIndex stehen... Zitat:
Zitat:
|
Re: Dem Typ TObject eine Property hinzufügen
Hallo,
gehe ich recht in der Annahme, dass man über einen ClassHelper nur Methoden hinzufügen kann und keine Eigenschaften? Das folgende Code funktioniert mit D2005 Personal
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TObjectHelper = class helper for TObject public function LanguageIndex: Integer; end; TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function TObjectHelper.LanguageIndex : Integer; begin Result:=5; end; end. |
Re: Dem Typ TObject eine Property hinzufügen
Vieln Dank Jens, jetzt funktioniert das ganze wunderbar!!!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz