Via Button eine neue FrameForm aufrufen

Für Fragen von Einsteigern und Programmieranfängern...
Live
Beiträge: 144
Registriert: So 22. Aug 2010, 16:06
OS, Lazarus, FPC: Backtrack 5 RC4 - 64bit Gnome
CPU-Target: 64bit
Wohnort: NRW
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Live »

frame1 : TFrame1;

in die Klassendeklaration einfügen?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Socke »

Bauer321 hat geschrieben:

Code: Alles auswählen

Form1.parent := frame;
  TFrame2.visible := true;
[...]
  Form1.parent := frame;
  TFrame1.visible := true;
Spätestens in diesen beiden Zeilen sollte der FPC stehen bleiben, da zumindest TFrame2 eine Klasse und Visible eine Objekt-Eigenschaft ist.
Andererseits solltest du alle Frames, die nicht angezeigt werden, verstecken (Visible := False). Ansonsten darfst du dich evtl. auch noch mit Z-Order herumschlagen (bzw. BringToFront aufrufen, wenn es sowas gibt).

Der andere Punkt ist, die Zeile "Form1.parent := frame;", die auch im objektorientierten Sinne nicht nur falsch ist:
  • Form1 ist eine globale Variable vom Typ TForm1. Das ist in der eine bestimmte Instanz dieser Klasse (auch wenn du wahrscheinlich nur eine Instanz dieses Formulars haben wirst). Da die Klasse TForm1 aber allgemein in jeder Variablen gespeichert werden soll, solltest du Self.Parent verwenden. Self ist immer eine Variable, die auf das Objekt zeigt, welches diese Funktion aufruft und somit nur in Methoden (=Funktionen und Prozeduren einer Klasse oder eines Objektes) verfügbar.
  • Die Eigenschaft "Parent" ist immer ein Control, auf dem das jeweilige Element angezeigt wird. In deinem Falle würde Form1 auf "frame" angezeigt (mit der Position aus Height und Width des Formulars). Richtig wäre frame.Parent := Self;
Noch ein paar Hinweise: Parent muss nur einmal gesetzt werden (solange alles bleibt wie es ist). Das machst du am Besten, nachdem du das Frame erstellt hast. An dieser Stelle wäre es auch ein guter Zeitpunkt alles andere wie Position, Größe usw. zu setzen.

Bei geschätzten 20 Frames (du hast 20 Speedbuttons) wäre wohl eine Liste oder ein array of TFrame eine einfache und vor allem übersichtliche Möglichkeit die Frames zu verwalten.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Bauer321 »

könntet ihr mit bitte den code reinstellen wie ich zum beispiel wenn ich auf SpeedButton1 klicke Frame 1 in mienem Frame angezeigt bekomme und wenn ich auf TSpeedButton2 klicke Frame 2 in meinem frame angezeigt bekomme?
www.mcpatcher.net | www.hoeper.me

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Socke »

Bauer321 hat geschrieben:könntet ihr mit bitte den code reinstellen wie ich zum beispiel wenn ich auf SpeedButton1 klicke Frame 1 in mienem Frame angezeigt bekomme und wenn ich auf TSpeedButton2 klicke Frame 2 in meinem frame angezeigt bekomme?
Bei diesem Beispiel musst du jedem Button in der Eigenschaft "Tag" eine Zahl zwischen 0 und 19 eintragen. Wenn du das übernimmst, füge bitte noch die notwendigen Überprüfungen ein.

Code: Alles auswählen

fFrames: array[0..19] of TFrame;
  fLastFrame: TFrame;
...
procedure TForm1.ButtonClick(Sender: TObject);
begin
  fLastFrame.Hide;
  fFrames[TSpeedButton(Sender).Tag].Show;
  fLastFrame := fFrames[TSpeedButton(Sender).Tag];
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Bauer321 »

also irgendwie klappt das von vorne bis hinten nicht...

Code: Alles auswählen

unit unit_sf;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Buttons, ExtCtrls, ComCtrls, OpenURLUtil,
  unitframe_start, unitframe_questhelper;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    frame: TFrame2;
    Image1: TImage;
    SpeedButtonLogout: TSpeedButton;
    SpeedButtonOptions: TSpeedButton;
    SpeedButtonTaverne: TSpeedButton;
    SpeedButtonArena: TSpeedButton;
    SpeedButton5: TSpeedButton;
    SpeedButtonWache: TSpeedButton;
    SpeedButtonWLaden: TSpeedButton;
    SpeedButtonZLaden: TSpeedButton;
    SpeedButtonStall: TSpeedButton;
    SpeedButtonDealer: TSpeedButton;
    SpeedButtonCharakter: TSpeedButton;
    SpeedButtonPost: TSpeedButton;
    SpeedButtonGilde: TSpeedButton;
    SpeedButtonHalle: TSpeedButton;
    SpeedButtonDungeons: TSpeedButton;
    SpeedButtonCopy: TSpeedButton;
    SpeedButtonSFgame: TSpeedButton;
    SpeedButtonShop: TSpeedButton;
    SpeedButtonForum: TSpeedButton;
    SpeedButtonAnleitung: TSpeedButton;
    procedure SpeedButtonForumClick(Sender: TObject);
    procedure SpeedButtonLogoutClick(Sender: TObject);
    procedure SpeedButtonSFgameClick(Sender: TObject);
    procedure SpeedButtonTaverneClick(Sender: TObject);
  private
    { private declarations }
      fFrames: array[0..19] of TFrame;
      fLastFrame: TFrame;
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{ TForm1 }
 
procedure TForm1.SpeedButtonLogoutClick(Sender: TObject);
begin
  Close;
end;
 
procedure TForm1.SpeedButtonForumClick(Sender: TObject);
begin
  OpenUrl('http://forum.sfgame.de/');
end;
 
procedure TForm1.SpeedButtonSFgameClick(Sender: TObject);
begin
  OpenUrl('http://s10.sfgame.de/index.php?rec=19464');
end;
 
procedure TForm1.SpeedButtonTaverneClick(Sender: TObject);
begin
  fLastFrame.Hide;
  fFrames[TSpeedButton(Sender).Tag].Show;
  fLastFrame := fFrames[TSpeedButton(Sender).Tag];
end;
 
initialization
  {$I unit_sf.lrs}
 
end.
www.mcpatcher.net | www.hoeper.me

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Via Button eine neue FrameForm aufrufen

Beitrag von carli »

Na weil du den Tag nicht gesetzt hast, so wie es im Vorgängerpost steht.

Edit: Außerdem hast du noch nicht mal das Array mit Werten gefüllt

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Bauer321 »

hmmm... also so gehts auch noch nicht

Code: Alles auswählen

unit unit_sf;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Buttons, ExtCtrls, ComCtrls, OpenURLUtil,
  unitframe_start, unitframe_questhelper;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    frame: TFrame2;
    Image1: TImage;
    SpeedButtonLogout: TSpeedButton;
    SpeedButtonOptions: TSpeedButton;
    SpeedButtonTaverne: TSpeedButton;
    SpeedButtonArena: TSpeedButton;
    SpeedButton5: TSpeedButton;
    SpeedButtonWache: TSpeedButton;
    SpeedButtonWLaden: TSpeedButton;
    SpeedButtonZLaden: TSpeedButton;
    SpeedButtonStall: TSpeedButton;
    SpeedButtonDealer: TSpeedButton;
    SpeedButtonCharakter: TSpeedButton;
    SpeedButtonPost: TSpeedButton;
    SpeedButtonGilde: TSpeedButton;
    SpeedButtonHalle: TSpeedButton;
    SpeedButtonDungeons: TSpeedButton;
    SpeedButtonCopy: TSpeedButton;
    SpeedButtonSFgame: TSpeedButton;
    SpeedButtonShop: TSpeedButton;
    SpeedButtonForum: TSpeedButton;
    SpeedButtonAnleitung: TSpeedButton;
    procedure SpeedButtonForumClick(Sender: TObject);
    procedure SpeedButtonLogoutClick(Sender: TObject);
    procedure SpeedButtonSFgameClick(Sender: TObject);
    procedure SpeedButtonTaverneClick(Sender: TObject);
  private
    { private declarations }
      fFrames: array[0, 1, 2, 3, 4, 5] of TFrame;
      fLastFrame: TFrame;
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{ TForm1 }
 
procedure TForm1.SpeedButtonLogoutClick(Sender: TObject);
begin
  Close;
end;
 
procedure TForm1.SpeedButtonForumClick(Sender: TObject);
begin
  OpenUrl('http://forum.sfgame.de/');
end;
 
procedure TForm1.SpeedButtonSFgameClick(Sender: TObject);
begin
  OpenUrl('http://s10.sfgame.de/index.php?rec=19464');
end;
 
procedure TForm1.SpeedButtonTaverneClick(Sender: TObject);
begin
  fLastFrame.Hide;
  fFrames[TSpeedButton(Sender).1].Show;
  fLastFrame := fFrames[TSpeedButton(Sender).1];
end;
 
initialization
  {$I unit_sf.lrs}
 
end.
www.mcpatcher.net | www.hoeper.me

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Bauer321 »

*push
www.mcpatcher.net | www.hoeper.me

shokwave
Beiträge: 476
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Via Button eine neue FrameForm aufrufen

Beitrag von shokwave »

carli hat geschrieben:Na weil du den Tag nicht gesetzt hast, so wie es im Vorgängerpost steht.

Edit: Außerdem hast du noch nicht mal das Array mit Werten gefüllt
Was gefällt dir an der Antwort nicht? Außer das man jetzt noch sage könnte:

Code: Alles auswählen

TSpeedButton(Sender).1
Was soll das sein?
An deinem Code kann man nicht sehen, dass die Tags gesetzt sind, das Array jetzt gefüllt ist, bzw. die Frames erstellt werden. Du verrätst noch nicht mal was der Compiler sagt bzw. was nicht geht. Wie soll da jemand antworten?

[Edit]
Ich glaube jetzt hab ich es verstanden.
Du wolltest mit "TSpeedButton(Sender).1" den Tag füllen? Gemeint war aber, das du der Variable "Tag", jedes SpeedButtons einen Wert zuweist, z.B.:

Code: Alles auswählen

SpeedButton1.Tag:=1;
Da du diesen Wert ja später wieder abfragst.

Code: Alles auswählen

fFrames[TSpeedButton(Sender).Tag].Show;
fLastFrame := fFrames[TSpeedButton(Sender).Tag];
Das und die Erstellung der Frames des Arrays kannst du im OnCreate-Ereignis der Form1 erledigen.
mfg Ingo

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Bauer321 »

ich habs jetzt nochmal in nem neuen projekt einfach nur den wechsel der frames hinzubekommen aber ich bekomms nicht hin.

habe jetzt 2 TButtons

Der eine (Button1) da habe ich Tag auf 1 gestzt bei Button2 habe ich tag auf 2 gestzt.

es gibt 2 Frames und zwar Tframe1(in unit2) und Tframe2(in unit 3)

bei uses habe ich sie eingefügt:

Code: Alles auswählen

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, 
  StdCtrls, Unit2, Unit3;
 
 //.....
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Frame1_1: TFrame1;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
 
 //.....
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  close;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  fFrames: array[1,2] of TFrame;
  fLastFrame: TFrame;
 
  fFrames[TButton(Sender).Tag].Show;
  fLastFrame := fFrames[TButton(Sender).Tag];
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  frame1.visible:=false;
  form1.parent:=frame1;
  frame2.visible:=ture;
end;
www.mcpatcher.net | www.hoeper.me

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Socke »

Schau dir bitte nochmal deinen Quelltext in deinem Post oben (direkt vor mir) an und überlege, ob der Compiler das wirklich so schluckt. Ja? Welchen Compiler verwendest du? :D

TForm1.FormCreate() ist völliger Käse; vielleicht hast du hier aber auch nur var und begin vertauscht und letzteres vergessen.
TForm1.Button1Click() enthält ebenfalls Käse (aber semantisch richtigen); fram1 und fram2 sind irgendwo aber nicht in dieser Unit deklariert. form1 könnte in dieser Unit deklariert sein (vielleicht ist's eine Instanz von TForm1, vielleicht aber auch nicht). Wenn es ein Formular ist, ist es wohl nicht in deinem Sinne, dieses auf frame1 anzuzeigen (außer form1 ist ein TFrame und frame1 ist ein TForm, aber so verwirrt wirst du sicherlich nicht sein).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Bauer321 »

kann mir bitte einer das mal zeigen ich hab da ehrlich gesagt keine ahnung wie ich das jetzt anstellen soll...

so hab ich angefangen..... <--- zum download da klicken
VirusTotal Scan
www.mcpatcher.net | www.hoeper.me

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Via Button eine neue FrameForm aufrufen

Beitrag von u-boot »

ohne den link angesehen zu haben:

Bisher sieht dieser Thread für mich nicht so aus, als wäre dein Ziel selber was zu machen.
Falls der Schein trügen sollte, fang mit Beispielen an, bei denen du wenigstens halbwegs selbst weisst, in welcher Richtung das Ziel liegt.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Via Button eine neue FrameForm aufrufen

Beitrag von Bauer321 »

doch mein ziel ist es schon sowas selbst zu machen und ich habe da auch schon einiges ausprobiert nur bin ich anfänger und irgenwie total überfordert.
deshalb würde ich mich sehr darüber freuen wenn mir das jemand einmal in dem minibeispiel machen könnte. dann kann ich es auf das andere programm übertragen und werde es bestimmt auch verstehen.
nur habe ich bis jetzt leider fast nur bahnhof verstanden

sry ;)
www.mcpatcher.net | www.hoeper.me

Benutzeravatar
theo
Beiträge: 10999
Registriert: Mo 11. Sep 2006, 19:01

Re: Via Button eine neue FrameForm aufrufen

Beitrag von theo »

Bauer321 hat geschrieben: deshalb würde ich mich sehr darüber freuen wenn mir das jemand einmal in dem minibeispiel machen könnte.
Du solltest vielleicht mal eine Einführung in Pascal durcharbeiten.
Sorry, aber du weisst nicht mal wie man Variablen deklariert.
Das Forum eignet sich nicht, um die Grundlagen zu erlernen.

Antworten