![]() |
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. |
Re: Zugriff auf Label aus "externer" Unit (neu gef
Du musst die fremde Unit in den Uses einbinden
|
Re: Zugriff auf Label aus "externer" Unit (neu gef
indem du objForm nach TFrmMain castest oder gleich (objForm: TFrmMain) verwendest
|
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) |
Re: Zugriff auf Label aus "externer" Unit (neu gef
Delphi-Quellcode:
(objForm as TFrmMain).lblName01.caption = getlngString(LngNr, 1004);
Zitat:
|
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 |
Re: Zugriff auf Label aus "externer" Unit (neu gef
Zitat:
du meinst wohl
Delphi-Quellcode:
@MisterCP: wenn du die Unit im Implementation-Teil bekannt gibst hast du keine zirkuläre Unitreferenz:
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;
Delphi-Quellcode:
interface
// bla implementation uses UnitMitTFrmMain; procedure ChangeLanguage; begin frmMain.lblName01.caption = getlngString(LngNr, 1004); frmMain.lblDescr01.caption = getlngString(LngNr, 1008); //... usw. end; |
Re: Zugriff auf Label aus "externer" Unit (neu gef
Eher
Delphi-Quellcode:
MyFrmMain := (objForm as TFrmMain); //Softcast
|
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. |
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 |
Re: Zugriff auf Label aus "externer" Unit (neu gef
Label1.Handle dürfte aber schwierig werden :zwinker:
|
Re: Zugriff auf Label aus "externer" Unit (neu gef
Hallo,
stimmt ;) Heiko |
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:
den neuen Wert zuweisen und die eigentliche Funktion steht in Deiner externen Unit. So muss die unLGU nur in die uses Anweisung von frmMain.
label1.caption := getNewLabelCaption(IrgendeinUebergabeparameter);
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. |
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:
Es gibt mehrere Möglichkeiten, wie man diese Prozedure ganz allgemein aufrufen kann, ohne jedes einzelne Formular
procedure TForm1.SetLanguage;
begin SetLngCaption(lblName01, 1004); SetLngCaption(lblDescr01, 1008); ... end; 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