![]() |
Delphi-Version: 5
Zugriff auf Frame-Objekte
Hallo,
Ich habe ein Programm und will dieses mehrsprachig herausbringen. Ich verwende der Übersicht halber Frames für die verschiedenen Schritte, es soll einen Wizard-Ähnlichen Aufbau besitzen. Wie kann ich, wenn auf meinem Hauptfenster ein Button oder etwas ähnliches gedrückt wird, die Beschriftung der Captions ändern? Ich will nicht zweimal den selben Frame, nur in 2 verschiedenen Sprachen erstellen, dann wären ja die Vorteile eines solchen weg und davon.... Weiß jemand Rat? Danke; |
AW: Zugriff auf Frame-Objekte
ich weiß nich ob du das meinst was ich verstehe aber fals es das wäre, was ich nicht glaube, geht es mit
Delphi-Quellcode:
fals ich dich falsch verstanden habe dann sorry für die dumme antwort ;)
<objekt>.caption
|
AW: Zugriff auf Frame-Objekte
oh ja die antwort war dumm: aber deine frage gibt es bereits;
![]() |
AW: Zugriff auf Frame-Objekte
Eure beiden Antworten waren "dumm" :wink:...
Ne, aber mal im ernst: Mein Problem ist nicht, wie ich ein Frame erstellen kann, sondern, wie ich Zugriff auf die Objekte eines von mir erstellten Frames habe. Ich habe meine Frames bereits in der DE angelegt ("Neuer Fram..."), diese werden beim Programmstart automatisch erstellt ("MyFrame := Frame1.Create"), jedoch nicht angezeigt (also "Visible := False"). Man kann, wärend das Programm läuft, die Sprache ändern, also zum einen die Beschriftungen des angezeigten Frames, als auch jene der zur Zeit unsichtbaren Frames geändert werden. Wie kann ich das realisieren? MFG |
AW: Zugriff auf Frame-Objekte
Zitat:
Wieso muss für jede Sprache ein neues Frame erstellt werden? Reicht es nicht, nur den jeweiligen Text auszutauschen (.Caption/.Text)? Zugriff hast Du im allgemeinen mit Frame1.Edit1.Text, in diesem Zusammenhang ist ev. noch FindComponents von Interesse. |
AW: Zugriff auf Frame-Objekte
Zitat:
Die Texte stehen in Ressourcen, die Du mit div. Programmen (von kostenlos bis kostenpflichtig) ändern kannst und wenn eine andere Sprache eingestellt wird, dann wechselst Du einfach die Ressource aus und fertig... ein paar Links zum Thema: ![]() ![]() ![]() ![]() Grüße |
AW: Zugriff auf Frame-Objekte
Hallo,
leider darf die Datei keine Auslagerungen verwenden. Ist es möglich, die Captions innerhalb meiner Anwendung zu ändern, möglicher Weise beim Erstellen der Instanz? Ich muss einen Set-Up erstellen, da kann ich keine äußeren Dateien zur Hilfe nehmen. Ist das möglich (außer mit Pointern von außen)? |
AW: Zugriff auf Frame-Objekte
Zitat:
MfG Dalai |
AW: Zugriff auf Frame-Objekte
Zitat:
Und klar: Du kannst jeden einzelnen Text manuell in deiner Software setzen. Viel Spaß dabei ;-) Und wegen deiner ersten Frage: Wenn Du eine Komponente (z.b. Label) auf einem Frame hast, dann sprichst Du diese von einer anderen Unit so an, wie Du das bei Feldern einer Klasse eben machst: Objektname.Komponentenname.Text:=''; Bei einem Form wird schon eine entsprechende Objektvariable automatisch angelegt, bei einem Frame nicht, hier musst Du selbst nachschauen wie Du damit arbeitest, irgend wo musst Du das Frame ja aufrufen und darstellen (also ein Frame.Show machen). Grüße |
AW: Zugriff auf Frame-Objekte
Zitat:
Wenn ich ein Objekt auf dem Frame ansprechen will, kommt die Fehlermeldung, dass dieses nicht gefunden werden könne. Ich habe nur Zugriff auf die Instanz des Frames selber (als Komponente), nicht aber auf die auf ihm befindlichen Objekte. Das ist ja mein Problem, und das wollte ich lösen, nur keine Ahrnung wie.... Dennis |
AW: Zugriff auf Frame-Objekte
Hi,
Wenn du in deiner Frame-Klasse z.B. einen Button Namens "Button1" hast dann kannst du mit einem Code wie diesem definitiv die Beschriftung setzen:
Delphi-Quellcode:
Falls das bei dir nicht funktioniert, dann zeigt doch bitte mal, wie du es versuchst (ohne den Code zu sehen, ist das ganze für die Leute hier bestenfalls ein Ratespiel)DeineFrameInstanz.Button1.Caption := 'Wuppdi'; // "DeineFrameInstanz" muss vom korrekten Datentyp sein! // Es darf sich also nicht nur um ein TFrame handeln, sondern // es muss ein TDeineFrameKlasse sein! Allerdings ist der direkte Zugriff auf die Komponenten kein guter Stil! Besser ist es, eine Methode in dem Frameobjekt zu erstellen die den gewünschten Sprachwechsel durchführt (diese Methode greift dann ganz normal auf die Komponenten zu). Von außen wird dann nur noch diese Methode aufgerufen, statt alle Komponenten von außen einzeln anzusprechen. Ciao, Ralf |
AW: Zugriff auf Frame-Objekte
Das habe ich auch vor, allerdings wollte ich euch nicht direkt mit der Sache so konfrontieren, weil es vom Prinzip her ja das selbe ist, ob ich eine Methode oder ein Objekt anspreche.
Also, hier die relevanten Teile des Codes:
Delphi-Quellcode:
{ Beim erstellen des Forms wird eine Instanz von frWelcome (dem Frame, das ich in der D.E. erstellt habe) erstellt }
Frame_Welcome := TfrWelcome.Create(fmUpdater); with Frame_Welcome do begin Parent := fmUpdater; Top := 40; Visible := False; end; { Selbstverständlich habe ich die Unit des Frames in die Uses-Klausel eingebunden } interface uses uWelcome, { Die Unit des Frames enthält folgende Prozedur, die es ermöglicht, die Captions zu ändern } procedure TfrWelcome.ChangeLanguage(Ger: Boolean); begin if Ger = True then begin laHeader.Caption := '...'; laText.Caption := '...'; end else begin laHeader.Caption := '...'; laText.Caption := '...'; end; end; { Logischer Weise muss die Prozedur also ansprechbar sein... } Frame_Welcome.ChangeLanguage(True); { ...ist sie aber nicht. Wieso? } |
AW: Zugriff auf Frame-Objekte
Hi,
sagst Du uns auch noch was für eine Fehlermeldung kommt und wann und wo oder sollen wir raten anfangen? ;-) Grüße |
AW: Zugriff auf Frame-Objekte
Zitat:
Code:
[Fehler] MeineHauptUnit.pas(108): Undefinierter Bezeichner: 'ChangeLanguage'
|
AW: Zugriff auf Frame-Objekte
OK, und wo wurde die Methode definiert? Public, private, published? Zeig mal den entsprechenden Teil der KLassendefinition des Frames...
|
AW: Zugriff auf Frame-Objekte
Hallo,
Ich habe es mit der Definition in der Klasse selber und in der Public-Sektion verusucht - Dasselbe Resultat... |
AW: Zugriff auf Frame-Objekte
Und wie ist die Variable Frame_Welcome deklariert?
|
AW: Zugriff auf Frame-Objekte
Das selbe....
Zur Zeit habe ich es unter 'Private' stehen, unter 'Public' kommt aber genau der selbe Fehler. |
AW: Zugriff auf Frame-Objekte
Man Dennis, das ist so banal. Zeig einfach den Code, dann sieht man es sofort.
Delphi-Quellcode:
Type
TMyFrame = Clas (TFrame) ... public Procedure ChangeLanguage(); ... end; |
AW: Zugriff auf Frame-Objekte
Zitat:
|
AW: Zugriff auf Frame-Objekte
Zitat:
Hier der Header meiner Haupt-Unit:
Delphi-Quellcode:
Hier der Header einer meiner Frame-Units:
unit uUpdater;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, ThemeMgr, IniFiles, uWelcome, uLicense, uProgress, uFinish; type TfmUpdater = class(TForm) pnSettings: TPanel; coLanguage: TComboBox; laLanguage: TLabel; pnButtons: TPanel; btCancel: TButton; btInstall: TButton; laCopyright: TLabel; ThemeManager1: TThemeManager; procedure Step(StepID: Integer); procedure ChangeLanguage; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure coLanguageChange(Sender: TObject); private { Private-Deklarationen } Frame_Welcome: TFrame; Frame_License: TFrame; Frame_Progress: TFrame; Frame_Finish: TFrame; LangIsGer: Boolean; CurrentStep: Integer; public { Public-Deklarationen } Next: String; Install: String; Finish: String; Msg_Cancel: String; end;
Delphi-Quellcode:
unit uLicense;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TfrLicense = class(TFrame) laHeader: TLabel; reLicense: TRichEdit; rbAgree: TRadioButton; rbDecline: TRadioButton; procedure ChangeLanguage(Ger: Boolean); procedure rbAgreeClick(Sender: TObject); procedure rbDeclineClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; implementation uses uUpdater; |
AW: Zugriff auf Frame-Objekte
Das klappt natürlich nicht weil du deine Variablen alle als TFrame deklariert hast.
Ändere einfach deine Deklaration von TFrame auf TWelcomeFrame (oder was auch immer) |
AW: Zugriff auf Frame-Objekte
Ich frage mich ernsthaft, warum du das Rad neu erfinden musst...
MfG Dalai |
AW: Zugriff auf Frame-Objekte
Schön, daß das nun endlich mal geklärt ist. (hat auch lange genug gedauert)
Denn genau deswegen hatte ich danach gefragt. Zitat:
|
AW: Zugriff auf Frame-Objekte
Müsste es nicht reichen, den Befehl
Delphi-Quellcode:
zu geben??
Frame_123 := TMyFrame.Create
|
AW: Zugriff auf Frame-Objekte
Zitat:
|
AW: Zugriff auf Frame-Objekte
Nur noch ergänzend:
Frame_123 ist ein Zeiger auf eine Speicherstelle. Der Compiler interpretiert diese als TFrame da Du das so angegeben hast. Willst Du das Objekt in anderer Form nutzen, musst Du casten:
Delphi-Quellcode:
Das ist natürlich etwas umständlich und sollte vermieden werden.
Frame_123: TFrame;
... Frame_123 := TMyFrame.Create; ... if Frame_123 is TMyFrame then (Frame_123 as TMyFrame).DoSpezial; |
AW: Zugriff auf Frame-Objekte
Hi Leute,
Danke für eure Hilfe, jetzt funktioniert alles. mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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