AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Wozu braucht man Frames? Hat jemand ein HowTo?
Thema durchsuchen
Ansicht
Themen-Optionen

Wozu braucht man Frames? Hat jemand ein HowTo?

Ein Thema von backdraft · begonnen am 12. Apr 2006 · letzter Beitrag vom 12. Apr 2006
Antwort Antwort
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#1

Wozu braucht man Frames? Hat jemand ein HowTo?

  Alt 12. Apr 2006, 09:48
Hallo zusammen,

gibt es irgendein Frame HowTo?

Wozu benutzt man Frames?
Kann ich aus Frames auf die Form zugreifen?
Warum bekomme ich ständig meldung, das mein Hauptformular eine Verbindung zu dem Frame hatte, die jetzt nicht mehr existiert.
Muss ich ein Frame mit Free freigen, wenn ich die Form zerstöre?
und und und... fragen über fragen...

Irgendwie komm ich da nicht so recht weiter...

Hab zwar viele Delphi bücher, aber auf das Thema Frame gehen die auch nur 1/2 Seite immer ein...

Vlt hat ja jemand mal ein Howto...

Danke Oliver
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Frame HowTo

  Alt 12. Apr 2006, 09:50
würdest du bitte einen etwas aussagekräftigeren Titel für deinen Thread benutzen? Mit dem bisherigen wird kaum jamnd etwas anfangen können. Editier dazu einfach deinen ersten Beitrag. Danke.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
HuxXx
(Gast)

n/a Beiträge
 
#3

Re: Frame HowTo

  Alt 12. Apr 2006, 10:03
Mann... du stellt zu viele Fragen, ich versuch dir einige davon zu eantworten:

- Ja,, man kanvon Frames auf die Form zugreifen... (Form1.top:=100);


Wozu benutzt man Frames? :
Damit das Programm übersichtlicher bleibt...

Ähm.., die anderen Fragen: Formulier sie mal besser...!

Greetz by Hux
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Frame HowTo

  Alt 12. Apr 2006, 10:10
Es gibt Situationen, da benötigt man mehrere identische Eingabeformulare, zum Beispiel auf TabSheets, wie hier zu sehen ist:



Ich habe mich hingesetzt und probiert, wie man so etwas am einfachsten bewerkstelligen kann und kam zu dem Ergebnis, das TFrames dafür ideal sind. Damit geht es ohne größeren Programmieraufwand.

Im Programm kann man in verschiedene Register zum Beispiel Namen hineinschreiben und diese dann auslesen. Die Namen schreibt man in ein TEdit, das über ein Frame auf jedes TabSheet gesetzt wird. Möchte man diese Eingabemaske bearbeiten, so genügt es, das Frame zu ändern, dann wird dies für jedes TabSheet übernommen.

Um ein Frame zu erstellen wählt man aus dem Menü Datei --> Neu --> Frame.
Folgendes bekommt man dann zu Gesicht:



Es ist quasi ein Formular, auf dem man natürlich nach Belieben Komponenten platzieren kann. Wir bestücken das Frame so:



Dann ziehen wir noch ein TPageControl (Register: Win32) aufs Formular, auf dem nachher die TabSheets angezeigt werden.

Nun zum eigentlichen Programmieren:

Das Frame müssen wir nun erst einmal in das Formular einbinden, was mittels

Delphi-Quellcode:
implementation

{$R *.dfm} 

//Frame einbinden
uses Unit2;
geschieht.

Dann erzeugen wir zur Laufzeit die TabSheets, die Frames für die einzelnen TabSheets und Labels zur Ausgabe des Namens. Dazu müssen wir die entsprechenden Variablen deklarieren. Ich habe sie global deklariert, dann kann man später von anderen Formularen einfach darauf zugreifen, aber es geht natürlich genauso lokal:

Delphi-Quellcode:
var
  MyTabSheet: TTabSheet;
  MyFrame: TFrame;
  MyLabel: TLabel;
In unserem Beispiel erstellen wir 4 TabSheets mit den dazugehörigen Frames und Ausgabelabels:

Delphi-Quellcode:
var
  i: integer;
begin
  for i := 1 to 4 do
  begin
    //TabSheets anlegen
    MyTabSheet := TTabSheet.Create(PageControl1);
    MyTabSheet.PageControl := PageControl1;
    MyTabSheet.Name := 'MyTab_' + IntToStr(i);
    MyTabSheet.Caption := 'Register Nr. ' + IntToStr(i);
    MyTabSheet.Show;

    //Frames drauf positionieren
    MyFrame := TFrame2.Create(Self);
    MyFrame.Name := 'MyFrame_' + IntToStr(i);
    MyFrame.Parent := MyTabSheet;
    MyFrame.Show;
  end;
end;
Nun erhält man 4 TabSheets mit jeweils einem Eingabeformular darauf. Um die eingetragenen Namen der einzelnen TabSheets auszulesen, geht man folgendermaßen vor:

Delphi-Quellcode:
var
  FrameText: string;
  i: integer;
begin
  for i := 1 to 4 do
  begin
    //Labels zur Ausgabe der Namen erstellen
    MyLabel := TLabel.Create(Form1);
    MyLabel.Name := 'MyLabel_' + IntToStr(i);
    MyLabel.Parent := Form1;
    MyLabel.Left := 10;
    MyLabel.Top := 220 + (MyLabel.Height + 10) * i;
    MyLabel.Show;

    //Den Text (Name) der einzelnen Frameszwischenspeichern ...
    FrameText := (FindComponent('MyFrame_' + IntToStr(i)) as TFrame2).Edit1.Text;
    //...und ausgeben
    (FindComponent('MyLabel_' + IntToStr(i)) as TLabel).Caption := FrameText;
  end;
end;
Nicht vergessen, am Ende wieder die erzeugten Objekte freizugeben:

Delphi-Quellcode:
//Objekte freigeben
procedure TForm1.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  for i := 1 to 4 do
  begin
    (FindComponent('MyFrame_' + IntToStr(i)) as TFrame2).Free;
    (FindComponent('MyLabel_' + IntToStr(i)) as TLabel).Free;
    (FindComponent('MyTabSheet_' + IntToStr(i)) as TTabSheet).Free;
  end;
end;
Hinweis:
Mit Frames hat man die gleiche Unterstützung durch die IDE wie es bei Forms der Fall ist.
Das heißt: Man kann sie fröhlich von einander ableiten, um zum Beispiel eine gewisse Funktionalität oder ein Layout in allen Ableitungen verwenden zu können.

Dazu geht man auf Datei --> Neu --> Weitere --> Projektname und Frame auswählen

Mein Dank für diesen Hinweis geht an Robert_G.



So, das war's schon, viel Spaß beim Ausprobieren.
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#5

Re: Frame HowTo

  Alt 12. Apr 2006, 10:35
Hi,

wow Matze, deine kleine Demo ist genau das, was ich brauche. Ich hab sowas schonmal mit ner von TTabSheet abgeleiteten Klasse probiert, wo ich dann die ganzen Kompos drauf hardgecoded hab...

Die Frage von backdraft kann ich leider nicht beantworten, sorry!

[edit=sakura] Aus Versehen, sorry. Mfg, sakura[/edit]
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Wozu braucht man Frames? Hat jemand ein HowTo?

  Alt 12. Apr 2006, 19:00
Ok, dann stelle ich mal genauere Fragen,

ich habe schon viel mit Frames gearbeitet, aber habe immer wieder Probleme. Vlt kann jemand die eine oder andere Frage ja beantworten.

1) Wie kann ich von dem Frame auf das Formular zugreifen in dem das Frame liegt? Solange ich keine dynamischen Forms habe, kann ich das Objekt ja einfach über den Namen ansprechen. Wie ist es aber, wenn ich die Forms dynamisch erzeuge? Über den Owner mit TForm1(Owner) kann ich das Objekt zwar ansprechen, aber wie realisiere ich zB folgendes. Ich habe ein Frame das nur einen Editor enthält. Dieses Frame soll in 2 Formularen benutzt werden. Wenn ich im Editor etwas ändere soll ein Event in der Form ausgeführt werden. In einer Kompoente würde ich einfach einen NotifyEvent Event aufrufen.

2) Man nehme ein Frame packt einen Button drauf und legt das Frame auf eine Form. Wie kann ich verhindern, dass beim Klicken auf der Form auf den Button ein "Frame21.Button1Click(Sender);" in meine Form geschrieben wird? Wie kann ich verhindern, dass an dem Frame überhaupt irgendwas verändert werden kann.

3) Wie bei Frage 2 nehmen wir das selbe Beispiel, legen aber diesmal ein Eltree auf die Form. Das Problem beim Eltree ist, das es zB die Headerinformationen in der DPR Datei nicht als Text sondern als Binärdaten ablegt. Ändere ich nun im Frame was ab, werden die Änderungen nicht auf die Form übernommen.

4) Gibt es eine Möglichkeit aus einem Frame oder aus einem Panel mit diversen Buttons und Edits ein Objekt zu machen. Die einzige Funktion die soetwas macht ist "Komponentenvorlage erzeugen", aber das ist ja nicht wirklich eine Hilfe. Um mir zu helfen habe ich immer eine Klasse erzeugt auf Basis TPanel, darauf dann im Creator diverse Objekte angelegt und eingestellt. Das ganze ist aber sehr mühselig, besonders, wenn ich eine ImageList darauf erzeugen will.

Oliver
Oliver
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Wozu braucht man Frames? Hat jemand ein HowTo?

  Alt 12. Apr 2006, 19:16
Hallo Oliver,

die Antwort auf Frage 1 kennst Du eigentlich schon. Du mußt eigentlich nur das nachprogrammieren, was Borland bei Komponenten in der VCL macht.

Delphi-Quellcode:
type
  TMyFrame = class (TFrame)
  private
    FOnChange : TNotifyEvent;
  protected
    procedure Changed;
  public
    property OnChange: TNotifyEvent
      read FOnChange write FOnChange;
  end;

procedure TMyFrame.Changed;
begin
  if Assigned(FOnChange) then
    FOnChange (Self);
end;
Innerhalb des Frames kannst Du nun bei Änderungen die Methode Changed aufrufen. Diese ruft dann die Ereignisbehandlung auf, sofern eine mit dem Frame verbunden wurde.
Im benutzenden Formular verbindest Du das Frame mit einer geeigneten Methode des Formulars:

Delphi-Quellcode:
procedure TForm.FormCreate (Sender: TObject);
begin
  Frame1.OnChange := FrameChanged;
end;

procedure TForm.FrameChanged (Sender: TObject);
begin
  // Reaktion auf Änderung im Frame
end;
Zu Frage 3: beim benutzten(!) Frame gibt es im Kontextmenü der Komponenten und des Objektinspektors einen Menüeintrag "Geerbte Einstellungen wiederherstellen". Dieser kann aber auch sehr tückisch sein, weil er auch die gewollten Änderungen rückgängig macht...

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#8

Re: Wozu braucht man Frames? Hat jemand ein HowTo?

  Alt 12. Apr 2006, 20:34
Das mit den dynamischen Forms ist auch ganz einfach: Du brauchst nur ein globales Array wo du die Zeiger auf die Forms drin ablegst. Dann kannst du über TForm1(FormsArray[x]) oder so auf dein dynamisches Form zugreifen. Und mit "über den Namen zugreifen" bei statischen Forms, meinst du da FindComponent? Ich hab hier drin mal gelesen, dass das nicht mit dynamischen Komponenten geht, aber wärscheinlich nur, weil da niemand die Eigenschaft Name zuweist. Is jetz aber nur so ne Vermutung.

Snuffi
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 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