Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriff auf Frame-Objekte (https://www.delphipraxis.net/168343-zugriff-auf-frame-objekte.html)

Dennis07 16. Mai 2012 12:33

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;

blubber443 16. Mai 2012 18:58

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:
<objekt>.caption
fals ich dich falsch verstanden habe dann sorry für die dumme antwort ;)

blubber443 16. Mai 2012 19:06

AW: Zugriff auf Frame-Objekte
 
oh ja die antwort war dumm: aber deine frage gibt es bereits; hier

Dennis07 17. Mai 2012 19:30

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

blawen 17. Mai 2012 22:41

AW: Zugriff auf Frame-Objekte
 
Zitat:

Zitat von Dennis07 (Beitrag 1167003)
Eure beiden Antworten waren "dumm" :wink:...

Vielleicht liegt es ja auch an der Fragestellung :roll:

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.

Lemmy 18. Mai 2012 07:58

AW: Zugriff auf Frame-Objekte
 
Zitat:

Zitat von Dennis07 (Beitrag 1166781)
Wie kann ich, wenn auf meinem Hauptfenster ein Button oder etwas ähnliches gedrückt wird, die Beschriftung der Captions ändern?

indem Du dich kurz einliest wie du das mit Delphi machen musst und Du wirst dann sehen, dass Du nicht den Text der einzelnen Komponenten ändern musst, sondern dass das Delphi macht, wenn Du das entsprechend angehst. :-)

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:
http://delphi.about.com/od/toppicks/tp/aatplocalize.htm
http://www.torry.net/pages.php?id=49
http://www.sisulizer.com/localizatio...html?s=g-dlt-1 (kostenpflichtig)
http://delloc.narod.ru/en.html (kostenlos)


Grüße

Dennis07 18. Mai 2012 18:23

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)?

Dalai 18. Mai 2012 19:14

AW: Zugriff auf Frame-Objekte
 
Zitat:

Zitat von Dennis07 (Beitrag 1167165)
Ich muss einen Set-Up erstellen, da kann ich keine äußeren Dateien zur Hilfe nehmen.

Warum nimmst du dann nicht die vorhandenen Möglichkeiten wie Inno Setup, Windows Installer (MSI), Nullsoft Installer (NSIS) usw.?

MfG Dalai

Lemmy 18. Mai 2012 19:28

AW: Zugriff auf Frame-Objekte
 
Zitat:

Zitat von Dennis07 (Beitrag 1167165)
leider darf die Datei keine Auslagerungen verwenden.

was bitte schön ist eine "Auslagerung"? Meinst Du damit dass irgend welche zusätzlichen Dateien zu deiner Software notwendig sind? Dann compilier die Ressourcen eben in die Exe mit rein - macht zwar wenig Sinn, weil die dann halt entsprechend größer wird aber das ist nicht das Problem.

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

Dennis07 18. Mai 2012 20:46

AW: Zugriff auf Frame-Objekte
 
Zitat:

Zitat von Lemmy (Beitrag 1167181)
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:='';
Grüße

Na das funktioniert ja eben nicht.
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

Ralf Kaiser 18. Mai 2012 23:37

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:

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

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

Dennis07 19. Mai 2012 13:11

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? }

Lemmy 19. Mai 2012 17:18

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

Dennis07 19. Mai 2012 18:36

AW: Zugriff auf Frame-Objekte
 
Zitat:

Zitat von Dennis07 (Beitrag 1167190)
Wenn ich ein Objekt auf dem Frame ansprechen will, kommt die Fehlermeldung, dass dieses nicht gefunden werden könne.

Wenn dus genauer Wissen willst:
Code:
[Fehler] MeineHauptUnit.pas(108): Undefinierter Bezeichner: 'ChangeLanguage'

Lemmy 19. Mai 2012 19:28

AW: Zugriff auf Frame-Objekte
 
OK, und wo wurde die Methode definiert? Public, private, published? Zeig mal den entsprechenden Teil der KLassendefinition des Frames...

Dennis07 19. Mai 2012 20:42

AW: Zugriff auf Frame-Objekte
 
Hallo,
Ich habe es mit der Definition in der Klasse selber und in der Public-Sektion verusucht - Dasselbe Resultat...

himitsu 20. Mai 2012 03:05

AW: Zugriff auf Frame-Objekte
 
Und wie ist die Variable Frame_Welcome deklariert?

Dennis07 20. Mai 2012 10:21

AW: Zugriff auf Frame-Objekte
 
Das selbe....
Zur Zeit habe ich es unter 'Private' stehen, unter 'Public' kommt aber genau der selbe Fehler.

Furtbichler 20. Mai 2012 12:09

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;

himitsu 20. Mai 2012 13:51

AW: Zugriff auf Frame-Objekte
 
Zitat:

Zitat von himitsu (Beitrag 1167300)
Und wie ist die Variable Frame_Welcome deklariert?

Antwort?

Dennis07 20. Mai 2012 17:22

AW: Zugriff auf Frame-Objekte
 
Zitat:

Zitat von Furtbichler (Beitrag 1167330)
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;

Das habe ich auch schon probiert, es funktioniert nicht, und das aus 3 Gründen.
  1. Wenn ich die Methode "Public" mache, muss ich alle der Objekte aktualisieren, das wäre aber nur eine Frage des Auswand, würde ich sogar in Kauf nehmen
  2. Nachdem ich die Objektnamen geändert habe (also von "Button1" auf "MyFrame.Button1") und das ganze kompiliere, kommt die Frage, ob ich uMyFrame in uMyFrame einbinden will, was ja sowieso schon mal blödsinn ist. Wenn ich auf "Ja" klicke und neu starte, kommt die fehlermeldung, dass ich eine Unit nicht in sich selber einbinden könne (was ja auch logisch ist)
  3. Naja, ein drittes Problem wäre, dass ich insgesamt 5 Frames habe, und jedes eine "ChangeLanguage"-Prozedur hat. Diese will ich von der Haupt-Unit nacheinander brav aufrufen, deshalb die dekleration innerhalb des Frames

Hier der Header meiner Haupt-Unit:
Delphi-Quellcode:
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;
Hier der Header einer meiner Frame-Units:
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;

daywalker9 20. Mai 2012 17:30

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)

Dalai 20. Mai 2012 17:46

AW: Zugriff auf Frame-Objekte
 
Ich frage mich ernsthaft, warum du das Rad neu erfinden musst...

MfG Dalai

himitsu 20. Mai 2012 18:15

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:

Delphi-Quellcode:
    Frame_Welcome: TFrame;
    Frame_License: TFrame;
    Frame_Progress: TFrame;
    Frame_Finish: TFrame;

Woher soll eine TFrame-Variable auch die Komponenten/Felder kennen, welche z.B. erst in TfrLicense deklariert wurden?

Dennis07 20. Mai 2012 18:42

AW: Zugriff auf Frame-Objekte
 
Müsste es nicht reichen, den Befehl
Delphi-Quellcode:
Frame_123 := TMyFrame.Create
zu geben??

daywalker9 20. Mai 2012 19:02

AW: Zugriff auf Frame-Objekte
 
Zitat:

Zitat von Dennis07 (Beitrag 1167356)
Müsste es nicht reichen, den Befehl
Delphi-Quellcode:
Frame_123 := TMyFrame.Create
zu geben??

Nein, TFrame weiß nichts von deiner Funktion ChangeLanguage in TfrLicence (da Du ja von TFrame ableitest). Ändere einfach TFrame auf TfrLicence ab und kompiliere.

stahli 20. Mai 2012 20:02

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:
Frame_123: TFrame;
...
Frame_123 := TMyFrame.Create;
...
if Frame_123 is TMyFrame then
  (Frame_123 as TMyFrame).DoSpezial;
Das ist natürlich etwas umständlich und sollte vermieden werden.

Dennis07 21. Mai 2012 08:11

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