Delphi-PRAXiS

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!

alzaimar 7. Mär 2006 16:55

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.

alcaeus 7. Mär 2006 16:56

Re: Dem Typ TObject eine Property hinzufügen
 
Hallo,

ungetestet:
Delphi-Quellcode:
type
  TObjectHelper = class helper for TObject
  public
    LanguageIndex: Integer;
  end;
Sollte eigentlich funktionieren :)

Greetz
alcaeus

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

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

Zitat von alzaimar
Für mehrsprachige Anwendungen würde ich GNUGetText verwenden, da hat sich dann jemand die Mühe schonmal gemacht.

meinst du das hier: http://dybdahl.dk/dxgettext/??

s.h.a.r.k 7. Mär 2006 17:01

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

Zitat von alcaeus
Delphi-Quellcode:
type
  TObjectHelper = class helper for TObject
  public
    LanguageIndex: Integer;
  end;

Mal blöd gefragt: Was mach ich damit, bzw wo füge ich den Code hinzu?! und was genau macht das?!

[Edit]In meiner Delphi-Hilfe habe ich das hier gefunden
Zitat:

Class Helpers (.NET)
Allerdings progge ich nicht in .NET...
[/Edit]

alcaeus 7. Mär 2006 17:26

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

s.h.a.r.k 7. Mär 2006 23:59

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:

[Error] Unit1.pas(20): E2169 Field definition not allowed after methods or properties
Das for im Quelltext unterstreicht er rot und als Meldung kommt da dann:
Zitat:

Failed to find standard type of 'TObjectHelper'
Ich hoffe du kannst mir weiterhelfen!

Jens Schumann 8. Mär 2006 08:05

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.

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

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