Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriff auf Label aus "externer" Unit (neu gefragt) (https://www.delphipraxis.net/117586-zugriff-auf-label-aus-externer-unit-neu-gefragt.html)

MisterCP 21. Jul 2008 14:28


Zugriff auf Label aus "externer" Unit (neu gefragt
 
Hi,

das Thema wurde zwar im Febr. schon mal angefragt, aber aus meiner Sicht haben die antwortenden User den Frager event.nicht richtig verstanden. und daher hoffe ich, daß es vielleicht doch noch eine "schöne Lösung" gibt:

Problemstellung:
- auf der Form frmMain befinden sich zahlreiche Objekte, u.A. Labels und Memos.
- der Ordnung halber werden bestimmte Proceduren, die sich dieser Objekte bedienen in eigene Units ausgelagert, so z.B. alle Routinen für die Sprachumschaltung in eine Unit untLGU oder alles was die anzuzeigenden Werte darstellt in untDraw.

In VB (da komme ich eigentlich her) ist das jetzt ganz einfach, da habe ich aus jedem Modul (unit) zugriff über z.B. frmMain.lblName01.caption .

Die einzelne Übergabe aller Objekte in die Procedur scheidet aus, da ich innerhalb der Procedur mehrere Objekte aus der Form ansprechen will.

Frage:
Wie müßte die RICHTIGE deklaration aussehen wenn ich in der untLGU folgendes machen wollte

procedure ChangeLanguage(objForm: TObject);
objForm.lblName01.caption = getlngString(LngNr, 1004);
objForm.lblDescr01.caption = getlngString(LngNr, 1008);
... usw.

Schon mal im Voraqus vielen Dank für die hoffentlich creativen Lösungsvorschläge.

mkinzler 21. Jul 2008 14:31

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Du musst die fremde Unit in den Uses einbinden

dominikkv 21. Jul 2008 14:31

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
indem du objForm nach TFrmMain castest oder gleich (objForm: TFrmMain) verwendest

MisterCP 21. Jul 2008 14:47

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
erst mal danke für die schnelle Antwort.

@mkinzler: das war mir schon klar, sonst wird die proc ja nicht gefunden :-)
@dominikkv:
- was bitte ist casten, bzw. wie geht das?
- das mit (objForm: TFrmMain) war auch mein erster gedanke, aber dann bekomme ich die meldung [Error] untLGU.pas(24): Undeclared identifier: 'TFrmMain' weil in dieser richtung doch kein USES-verweis auf die untMain drin steht (wegen der cross-Referenz)

mkinzler 21. Jul 2008 14:51

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Delphi-Quellcode:
(objForm as TFrmMain).lblName01.caption = getlngString(LngNr, 1004);
Zitat:

weil in dieser richtung doch kein USES-verweis auf die untMain drin steht (wegen der cross-Referenz)
Binde rückwärts im Implementierungs-Teil ein

hoika 21. Jul 2008 14:58

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Hallo,

schöner wäre es allerdings, eine lokale Variable zu benutzen:

Delphi-Quellcode:
var
  MyFrmMain: TFrmMain;
begin
  MyFrmMain:= TFrmMain(objForm);   // die harten

  with MyFrmMain as TFrmMain(objForm) do   // die vorsichtigen checken den richtigen Typ
  begin
    MyFrmMain .Label1.Caption:= 'bla';
  end;
 
end;

Heiko

dominikkv 21. Jul 2008 16:17

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Zitat:

Zitat von hoika
Delphi-Quellcode:
  with MyFrmMain as TFrmMain(objForm) do   // die vorsichtigen checken den richtigen Typ
  begin
    MyFrmMain .Label1.Caption:= 'bla';
  end;

wtf?
du meinst wohl
Delphi-Quellcode:
with MyFrmMain do  
  begin
    Label1.Caption:= 'bla';
  end; // oder
with TFrmMain(objForm) do  
  begin
    Label1.Caption:= 'bla';
  end; // oder
with objForm as TFrmMain do  
  begin
    Label1.Caption:= 'bla';
  end;
@MisterCP: wenn du die Unit im Implementation-Teil bekannt gibst hast du keine zirkuläre Unitreferenz:

Delphi-Quellcode:
interface
  // bla
implementation
  uses
    UnitMitTFrmMain;

procedure ChangeLanguage;
begin
  frmMain.lblName01.caption = getlngString(LngNr, 1004);
  frmMain.lblDescr01.caption = getlngString(LngNr, 1008);
//... usw.
end;

mkinzler 21. Jul 2008 16:27

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Eher
Delphi-Quellcode:
  MyFrmMain := (objForm as TFrmMain); //Softcast

NickelM 21. Jul 2008 17:30

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Ich kenn mich jetzt net ganz sogut damit aus, aber (ganz dumm gefragt) geht das net vieleicht mit Handles????

Dass man vieleicht mit den WinAPI Funktionen den Caption setzt????
Wenn jetzt um andere Eigenschaften geht, die jetzt nur das label hat und nicht mit WinAPI geht, weiß ich mir auch keinen Rat.

hoika 21. Jul 2008 17:40

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Hallo,

na klar kann man auch nur das Handle speichern
und dann z.B. per SendMessage(Label_1_Handle, WM_SETTTEXT...
die Werte setzen.

Aber warum weg von der VCL ?

Eine andere Mögöiochkeit wäre,
sich in einer eigenen Klasse die TLabel zu merken (das macht das Form)
(quasi nur die Pointer) und dann die Klasse übergeben und benutzen.


Heiko

DeddyH 21. Jul 2008 17:42

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Label1.Handle dürfte aber schwierig werden :zwinker:

hoika 21. Jul 2008 17:44

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Hallo,

stimmt ;)


Heiko

Scooty78 21. Jul 2008 21:18

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Nochmal kurz die prakmatischen Möglichkeiten aus meiner Sicht.

1. Wie die Kollegen vorher schon beschrieben haben, die frmMain in die Uses Anweisung von unLGU hinzufügen.

oder

2. (So mache ich es meistens) verwende Funktionen bzw. Prozeduren in der unLGU die Dir den gewünschten Wert gleich zurückgeben.
Du könnsten in der frmMain das Label dann zb über

Code:
label1.caption := getNewLabelCaption(IrgendeinUebergabeparameter);
den neuen Wert zuweisen und die eigentliche Funktion steht in Deiner externen Unit. So muss die unLGU nur in die uses Anweisung von frmMain.
Dadurch bleiben Deine Funktionen auch gleich flexibler und Du kannst Sie ggf. auch für andere Zwecke wieder brauchen.


Ich hoffe das hilft Dir weiter.

sx2008 21. Jul 2008 23:44

Re: Zugriff auf Label aus "externer" Unit (neu gef
 
Dein Ansatz ist schon falsch.
Ein Formular ist für sich selbst verantwortlich; d.h. es sorgt selbst dafür, dass es ist der richtigen Sprache angezeigt wird.
So wie du dir das vorstellst, versteust die die Verantwortlichkeiten über mehrere Units.
Das führt zu einem Programm, in dem sich kaum mehr etwas ändern lässt ohne dass an anderer Stelle etwas passiert oder
eine Änderung notwendig wird.
Stell dir vor, du änderst den Namen eines Labels von "Label18" nach "LblBruttopreis".
Was sofort eine Änderung in der Unit untLGU nach sich zieht.

Mögliche Lösung:
Jedes Formular hat eine Procedure zur Sprachumstellung:
Delphi-Quellcode:
procedure TForm1.SetLanguage;
begin
  SetLngCaption(lblName01, 1004);
  SetLngCaption(lblDescr01, 1008);
  ...
end;
Es gibt mehrere Möglichkeiten, wie man diese Prozedure ganz allgemein aufrufen kann, ohne jedes einzelne Formular
mit Uses einzubinden.
Egal, wie viele Formulare deine Anwendung hat, solange jedes Formular die Procedure SetLanguage hat
ist es möglich die Sprache zur Laufzeit umzuschalten.
Die aktuelle Sprache (LngNr) ist in irgendeinem globalen Objekt hinterlegt;
man braucht die Variable nicht überall mitzuschleifen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 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-2025 by Thomas Breitkreuz