Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dem Typ TObject eine Property hinzufügen (https://www.delphipraxis.net/64717-dem-typ-tobject-eine-property-hinzufuegen.html)

s.h.a.r.k 7. Mär 2006 12:58


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

Boombuler 7. Mär 2006 13:09

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:
Sprache := blub.Tag and $FFFF0000;
RestTag := blub.Tag and $0000FFFF;
Oder du kompilierst eben TComponent bzw TObject neu...
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

Frickeldrecktuxer_TM 7. Mär 2006 13:47

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;

s.h.a.r.k 7. Mär 2006 14:08

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:
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;
Was du mit dem HighWord und LowWord meinst, weiß ich bisher zwar noch nicht, aber ich werd mich dieser Sache mal genauer annehmen...

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

Boombuler 7. Mär 2006 14:22

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;

s.h.a.r.k 7. Mär 2006 15:19

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

Boombuler 7. Mär 2006 15:49

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:
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;
Die einizge Bedingung dabei ist eben, dass du bei keiner der Zahlen den Wert 65535 überschreitest!

Greetz
Boombuler

alzaimar 7. Mär 2006 16:05

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;

Boombuler 7. Mär 2006 16:06

Re: Dem Typ TObject eine Property hinzufügen
 
Ups :oops:

Ich wusste ich hab was vergessen ;)

Greetz
Boombuler

s.h.a.r.k 7. Mär 2006 16:50

Re: Dem Typ TObject eine Property hinzufügen
 
Zitat:

Zitat von Boombuler
Die einizge Bedingung dabei ist eben, dass du bei keiner der Zahlen den Wert 65535 überschreitest!

Also das sollte nun weniger das Problem sein, aber das ganze find ich gar nicht mal so schlecht! Muss ich mal an einem kleinen Programm testen. Habe bisher leider noch nie was mit multilingualen Programm gemacht, aber irgendwann muss ich damit halt mal anfangen :) Vielen Danke für eure Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr.
Seite 1 von 2  1 2      

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