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 von einer Form auf Frame zugreifen (https://www.delphipraxis.net/59974-von-einer-form-auf-frame-zugreifen.html)

milanlu 31. Dez 2005 19:09


von einer Form auf Frame zugreifen
 
Hallo,
wie kann man von einer form auf eine bestimte procedure (ButtonClick) in einem Frame zugreifen.
danke im voraus

Knotti2005 31. Dez 2005 19:23

Re: von einer Form auf Frame zugreifen
 
Delphi-Quellcode:
procedure OnButtonClick....

begin
   frame1.label1.caption='Guten Rutsch';
end
so oder nicht...

milanlu 31. Dez 2005 19:29

Re: von einer Form auf Frame zugreifen
 
danke für guten rutsch wünsche ich dir auch und allen anderen delphi coder.
aber so geht eben nicht.

SirThornberry 31. Dez 2005 19:31

Re: von einer Form auf Frame zugreifen
 
dann liegt es vielleicht daran das diese dinge im protected des Frames liegen. Geht es auch nicht wenn du über Methoden und Propertys im Public darauf zugreifst?

milanlu 31. Dez 2005 19:33

Re: von einer Form auf Frame zugreifen
 
die sind aber im public.

SirThornberry 31. Dez 2005 19:37

Re: von einer Form auf Frame zugreifen
 
also ich kann ohne probleme auf Buttons etc. eines Frames zugreifen den ich erstellt habe.
Was heißt eigentlich geht nicht? Welche Fehlermeldung kommt wenn du wie im 2ten posting beschrieben darauf zugeifst?

milanlu 31. Dez 2005 19:49

Re: von einer Form auf Frame zugreifen
 
also Unit4 ist ein Frame:
Delphi-Quellcode:
unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, DirDialog, StdCtrls, Menus, Printers;

type
  Tframeumbenennen = class(TFrame)
    pnlmenue: TPanel;
    gbeingabe: TGroupBox;
    edteingabe: TEdit;
    btnordner: TButton;
    gbdatei: TGroupBox;
    lbdateien: TListBox;
    ordner: TDirDialog;
    popumbenennen: TPopupMenu;
    Dateiumbenennen1: TMenuItem;
    Dateilschen1: TMenuItem;
    Listelschen1: TMenuItem;
    Listedrucken1: TMenuItem;
    PrintDialog1: TPrintDialog;
    Aktualisieren1: TMenuItem;
    procedure FrameResize(Sender: TObject);
    procedure btnordnerClick(Sender: TObject);
    procedure Listelschen1Click(Sender: TObject);
    procedure Listedrucken1Click(Sender: TObject);
    procedure Dateilschen1Click(Sender: TObject);
    procedure Dateiumbenennen1Click(Sender: TObject);
    procedure Aktualisieren1Click(Sender: TObject);
  private

    { Private-Deklarationen }
  public
    procedure dateien_laden(Directory: String);
    { Public-Deklarationen }
  end;

implementation

uses Unit1, Unit5;

{$R *.dfm}
procedure Tframeumbenennen.dateien_laden(Directory: String);
var
SR: TSearchRec;
begin
  if (Directory<>'') and (Directory[length(Directory)]<>'\') then
    Directory:=Directory+'\';

  if (FindFirst(Directory + '*.mp3', faAnyFile-faDirectory, SR) = 0) then
  begin
    repeat
      if (SR.Name<>'.') and (SR.Name<>'..') and (SR.Attr<>faDirectory) then
      begin
         lbdateien.Items.Add(Directory + SR.Name);
      end;
    until FindNext(SR)<>0;
    FindClose(SR);
  end;
end;

procedure Tframeumbenennen.FrameResize(Sender: TObject);
begin
  pnlmenue.Width := frmprogramm.Width - frmprogramm.pnlmenue.Width - 32;
  pnlmenue.Height := frmprogramm.pnlmenue.Height;
end;

procedure Tframeumbenennen.btnordnerClick(Sender: TObject);
begin
  lbdateien.Items.Clear;
  if ordner.Execute then
  begin
    edteingabe.Text := ordner.DirName;
  end;
  if edteingabe.text <> '' then
  begin
    dateien_laden(edteingabe.text);
  end;
end;

procedure Tframeumbenennen.Listelschen1Click(Sender: TObject);
begin
    lbdateien.Items.Clear;
end;

procedure Tframeumbenennen.Listedrucken1Click(Sender: TObject);
var
Line: Integer;
PrintText: TextFile;
pesmica: String;
begin
  if PrintDialog1.Execute then
  begin
  AssignPrn(PrintText);
  Rewrite(PrintText);
  for Line := 0 to lbdateien.Items.Count - 1 do
  begin
    pesmica := ExtractFileName(lbdateien.Items[Line]);
    Writeln(PrintText, inttostr(Line) + ': ' + pesmica);
  end;
  CloseFile(PrintText);
  end;
end;

procedure Tframeumbenennen.Dateilschen1Click(Sender: TObject);
begin
    DeleteFile(lbdateien.Items[lbdateien.ItemIndex]);
    lbdateien.Items.Clear;
    dateien_laden(edteingabe.text);
end;

procedure Tframeumbenennen.Dateiumbenennen1Click(Sender: TObject);
begin
    if lbdateien.ItemIndex >= 0 then
    begin
      ordnerici := ExtractFileDir(lbdateien.Items[lbdateien.ItemIndex]);
      frmumbenennen1.edtalt.Text := ExtractFileName(lbdateien.Items[lbdateien.ItemIndex]);
      frmumbenennen1.edtneu.Text := ExtractFileName(lbdateien.Items[lbdateien.ItemIndex]);
      frmumbenennen1.Show;
    end;

end;

procedure Tframeumbenennen.Aktualisieren1Click(Sender: TObject);
begin
    lbdateien.Items.Clear;
    dateien_laden(edteingabe.text);
end;

end.
Unit 5 ist eine Form:
Delphi-Quellcode:
unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tfrmumbenennen1 = class(TForm)
    gbumbenennen: TGroupBox;
    edtalt: TEdit;
    lbalt: TLabel;
    lbneu: TLabel;
    edtneu: TEdit;
    btnok: TButton;
    btnno: TButton;
    procedure btnnoClick(Sender: TObject);
    procedure btnokClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public

    { Public-Deklarationen }
  end;

var
  frmumbenennen1: Tfrmumbenennen1;
  ordnerici: String;

implementation

uses Unit4, Unit1;
{$R *.dfm}

procedure Tfrmumbenennen1.btnnoClick(Sender: TObject);
begin
  ordnerici := '';
  frmumbenennen1.Close;
end;

procedure Tfrmumbenennen1.btnokClick(Sender: TObject);
begin
  if (ordnerici[length(ordnerici)] <> '\') then
  begin
    ordnerici := ordnerici + '\';
  end;

  if ((edtalt.Text <> edtneu.Text) and (edtneu.Text <> '')) then
  begin
    RenameFile(ordnerici + edtalt.Text, ordnerici + edtneu.Text);
Hier muss ich auf die procedure von Unit4 dateien_laden zugreifen aber es geht nicht!!! :wiejetzt:
Delphi-Quellcode:
    btnnoClick(Sender);

  end
  else
  begin
    MessageDlg('Die Angabe ist Fehlerhaft.'#13'Bitte überprüfen Sie die Angabe!!!', mtInformation, [mbOK], 0);
  end;
end;

end.

SirThornberry 31. Dez 2005 19:52

Re: von einer Form auf Frame zugreifen
 
dann musst du
Delphi-Quellcode:
frmumbenennen1.dateien_laden(DeineDatei);
aufrufen. Oder was für ein Fehler kommt dann?

milanlu 31. Dez 2005 19:55

Re: von einer Form auf Frame zugreifen
 
also so ich das sehe ist die procedure im Unit 4 und nicht im unit 5!
wenn schon dan frameumbenennen.dateien_laden(datei);
aber das geht leider nicht!

SirThornberry 31. Dez 2005 20:00

Re: von einer Form auf Frame zugreifen
 
du schreibst immer "das geht nicht". Was heißt "geht nicht"? Welche Fehlermeldung kommt?

milanlu 31. Dez 2005 20:02

Re: von einer Form auf Frame zugreifen
 
[Fehler] Unit5.pas(51): Undefinierter Bezeichner: 'dateien_laden'
[Fataler Fehler] Project2.dpr(9): Verwendete Unit 'Unit5.pas' kann nicht compiliert werden
[Pascal Fehler] Unit5.pas(1): Die Programmierhilfe kann nicht aufgerufen werden, da der Quelltext Fehler enthält

SirThornberry 31. Dez 2005 20:04

Re: von einer Form auf Frame zugreifen
 
stimmt. Also du könntest die procedure zu einer class-procedure machen und dann
Tframeumbenennen.dateien_laden(DeinVerzeichnis)
aufrufen, oder du lässt es wie jetzt musst eine Instanz von Tframeumbennen erzeugen und dann
DeineInstanz.dateien_laden(DeinVerzeichnis)
aufrufen.

wo ist bei dir eigentlich "frameumbenennen" deklariert?

milanlu 31. Dez 2005 20:07

Re: von einer Form auf Frame zugreifen
 
könntest du bitte mir ein beispiel schreiben wie ich das anstellen soll. mit classen bin ich nicht so gut.

BrinkschulteManfred 22. Feb 2006 13:05

Re: von einer Form auf Frame zugreifen
 
Hallo zusammen,

ist zwar schon eine Weile her, aber ich hatte / habe ein ähnliches Problem. Und zwar möchte ich verschiedene Frames dynamisch zur Laufzeit auf dem Formular einbinden, welches ich mit
Delphi-Quellcode:
  if Assigned(FrameInhalt) then FrameInhalt.Destroy;
FrameInhalt := TFrameFirma.Create(self);
FrameInhalt.Parent := FormMain;
FrameInhalt.Align := alClient;
FrameInhalt.Show;
mache. Dies funktioniert auch, allerdings möchte ich dann z.B. zur Laufzeit die Caption-Eigenschaft diverser Labels ändern. Leider weiß ich nun nicht, wie ich auf die Eigenschaften der Controlls in diesem dynamisch eingebundenen Frame zugreifen kann. Habe schon viel versucht, aber schon beim Entwurf scheitere ich jedesmal.

Hat jemand Ideen?

Beste Grüße
Manfred

alias5000 22. Feb 2006 13:29

Re: von einer Form auf Frame zugreifen
 
Wenn du z.B. ein dynamisches Array machst, und dir dadrin alle Frames speicherst:

Delphi-Quellcode:
Frames: array of TMyFrame;
Und dann schreibst du einfach
Delphi-Quellcode:
setlength(Frames, DieLänge);
Frames[xy] := TMyFrame.Create(Self);
Frames[xy].Parent := Form1;
Frames[xy].Align := alTop
{usw}
Verstanden?

Nightshade 22. Feb 2006 13:30

Re: von einer Form auf Frame zugreifen
 
Versuchs mal so :

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFrame2 = class(TFrame)
    Label_Ueberschrift: TLabel;
  private
    procedure SetUeberschrift(const Value: string);
    function GetUeberschrift: string;
    { Private-Deklarationen }
  public
    property Ueberschrift : string read GetUeberschrift write SetUeberschrift;
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}

{ TFrame2 }

function TFrame2.GetUeberschrift: string;
begin
  result := Label_Ueberschrift.Caption;
end;

procedure TFrame2.SetUeberschrift(const Value: string);
begin
  Label_Ueberschrift.Caption := Value;
end;

end.
Und dann in unit1 :

Delphi-Quellcode:
var
  Form1: TForm1;
  Frame2 : TFrame2;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Frame2 := TFrame2.Create(self);
  Frame2.Parent := Form1;
  Frame2.Align := alClient;
  Frame2.Ueberschrift := 'Test';
end;

BrinkschulteManfred 22. Feb 2006 14:40

Re: von einer Form auf Frame zugreifen
 
@alias5000
Hallo Alias5000,

verstanden habe ich Deinen Hinweis leider nicht, aber eigentlich möchte ich mit dem dynamischen Einbinden ja gerade verhindern, dass alle möglichen Frames inkl. aller Datenbankanbindungen beim Start des Programmes / Öffnen des Forms schon direkt geladen werden. Es soll also beim Aufruf eines bestimmten Menüs immer nur der Frame gezogen werden, der relevant ist. Ansonsten könnte ich ja auch alle Frames direkt im Formular einbinden und mit VISIBLE immer nur den Frame erscheinen lassen, den ich benötige.
Aber eventuell gibt es ja auch andere Möglichkeiten für dieses Vorgehen, an die nicht zur Zeit nicht gedacht habe.

@Nightshade
Hallo Nightshade,
vielen Dank für den Hinweis, aber
Delphi-Quellcode:
  Frame2.Ueberschrift := 'Test';
ist doch auch nichts anderes, als wenn ich
Delphi-Quellcode:
  Frame2.LabelXYZ.Caption := 'Test';
zuweise. Beides gibt übrigens den gleichen Fehler "Undefinierter Bezeichner: 'LabelXYZ'" bzw. "...'Ueberschrift'"

Ich denke, dass es daran liegt, dass zur Zeit der Kompilierung die Eigenschaften bzw. Controlls des Frames dem Form noch gar nicht bekannt sind, oder?

Besten Dank Euch beiden
Manfred

dataspider 22. Feb 2006 15:08

Re: von einer Form auf Frame zugreifen
 
[quote="BrinkschulteManfred"]Hallo zusammen,

ist zwar schon eine Weile her, aber ich hatte / habe ein ähnliches Problem. Und zwar möchte ich verschiedene Frames dynamisch zur Laufzeit auf dem Formular einbinden, welches ich mit
Delphi-Quellcode:
  if Assigned(FrameInhalt) then FrameInhalt.Destroy;
FrameInhalt := TFrameFirma.Create(self);
FrameInhalt.Parent := FormMain;
FrameInhalt.Align := alClient;
FrameInhalt.Show;
mache. Dies funktioniert auch, allerdings möchte ich dann z.B. zur Laufzeit die Caption-Eigenschaft diverser Labels ändern. Leider weiß ich nun nicht, wie ich auf die Eigenschaften der Controlls in diesem dynamisch eingebundenen Frame zugreifen kann. Habe schon viel versucht, aber schon beim Entwurf scheitere ich jedesmal.

Hat jemand Ideen?

Es ist wie bei allen Objekten.
FrameInhalt ist sicher als TFrame deklariert.
Willst du auf Controls aus TFrameFirma zugreifen, musst du TypeCasting verwenden.
Also:
Delphi-Quellcode:
if frameinhalt is TFrameFirma then
  with TFrameFirma(frameinhalt) do
  begin
    Labelx.Caption := 'Text';
    // und was auch immer
  end;
Cu, Frank

dataspider 22. Feb 2006 15:21

Re: von einer Form auf Frame zugreifen
 
@milanlu
Alle Methoden eine Klasse sind erst verfügbar, wenn du aus der Klasse ien Object erzeugst.
Dann kannst du über die Objectvariable mit FrameUmbenennen.Methode zugreifen.
In deinem Beispiel ist es nicht notwendig, die Methode DateiLaden in die Klasse aufzunehmen.
Es reicht in der Unit oder, wie schon erwähnt, als Class Methode...

Beide Varianten im Beispiel;

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  Tframeumbenennen = class(TFrame)
  private
    { Private-Deklarationen }
  public
    class procedure DateiLaden(Directory: string);
    { Public-Deklarationen }
  end;

procedure DateiLaden(Directory: string);

implementation

{$R *.dfm}

// Zugrifff einfach über DateiLaden(...
procedure DateiLaden(Directory: string);
begin
  // dein Code
end;

// Zugrifff über Tframeumbenennen.DateiLaden(...
class procedure Tframeumbenennen.DateiLaden(Directory: string);
begin
  // Dein Code
end;

end.
Cu, Frank

BrinkschulteManfred 22. Feb 2006 15:42

Re: von einer Form auf Frame zugreifen
 
@dataspider
Zitat:

Es ist wie bei allen Objekten.
FrameInhalt ist sicher als TFrame deklariert.
Willst du auf Controls aus TFrameFirma zugreifen, musst du TypeCasting verwenden.
Super, das war es, was ich gesucht habe! :spin2:

Ich habe noch viel zu lernen ...

Beste Grüße
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz