Kann mir jemand bei Lazarus weiter helfen? (Delphi, Pascal.)

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
dmant
Beiträge: 3
Registriert: So 3. Mai 2020, 19:55

Kann mir jemand bei Lazarus weiter helfen? (Delphi, Pascal.)

Beitrag von dmant »

Hallo,

ich habe eine Form....

Diese öffnet sich. Nach dem öffnen wird ein Frame angezeigt. Super.

Mit diesem Frame startet ein Timer der eine ProgressBar füllt. Sobald
die ProgressBar gefüllt ist soll sich der Frame wieder schließen und ein
nächster öffnen.

Ich bin soweit, das sich das Frame nach dem ablauf des Timer schließt,
jedoch dann passiert nichts mehr.

gui.pas

Code: Alles auswählen

unit gui;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  boot, Unit1;

type

  { TForm1 }

  TForm1 = class(TForm)
  Frame2_1: TFrame2;

  procedure FormCreate(Sender: TObject);

  private

  public
    Frame: TFrame;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Frame := TFrame1.Create(Self);
  Frame.Parent:= Frame2_1;
end;

end.
boot.pas

Code: Alles auswählen

unit boot;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, StdCtrls, ExtCtrls, ComCtrls;

type

  { TFrame1 }

  TFrame1 = class(TFrame)

  Image1: TImage;
  ProgressBar1: TProgressBar;
  Timer1: TTimer;
  procedure Timer1Timer(Sender: TObject);

  private
    MyObj: TObject;
    progressInt : Integer;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
  end;


implementation

{$R *.lfm}

{ TFrame1 }

destructor TFrame1.Destroy;
  begin
    MyObj.Free;
    inherited Destroy;
  end;

procedure TFrame1.Timer1Timer(Sender: TObject);
begin
     progressInt:= progressInt + 20;
     if progressInt=120 then
     begin
       Destroy;
     end;
     ProgressBar1.Position:= progressInt;

end;

constructor TFrame1.Create(TheOwner: TComponent);
  begin
    inherited Create(TheOwner);
    MyObj := TObject.Create;
  end;

end.
Wie kriege ich jetzt das ich danach wieder auf den Frame einen anderen
Frame anzeigen kann?

Ich hoffe mir kann der ein oder andere helfen.
Vielen dank.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4223
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Kann mir jemand bei Lazarus weiter helfen? (Delphi, Pascal.)

Beitrag von af0815 »

Du definierst den zweiten Frame genauso wie im ersten Frame, geht genauso wie bei einer russischen Matroska.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

dmant
Beiträge: 3
Registriert: So 3. Mai 2020, 19:55

Re: Kann mir jemand bei Lazarus weiter helfen? (Delphi, Pascal.)

Beitrag von dmant »

Naja,

also der Frame wird ja geöffnet und er schließt sich danach wieder.

Nun muss ich ja irgendwie in der main "erkennen" das der Frame geschlossen ist/wurde um dann den nächsten zu starten / zu öffnen.

Ich hatte das gefunden womit ich dann bei einem Destroy eine function in der main aufrufen konnte. In dieser funktion konnte ich jedoch dann keinen neuen Frame mehr erstellen weil er "Frame" auf einmal nicht mehr kannte..

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4223
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Kann mir jemand bei Lazarus weiter helfen? (Delphi, Pascal.)

Beitrag von af0815 »

Wenn du etwas zerstörst(frame) dann ist es weg und du musst einenneuen erzeugen.

Was willst du genau machen, das ist mir noch nicht klar. Und ich mache verdammt viel mit Frames.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wennerer
Beiträge: 191
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 19.3 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

Re: Kann mir jemand bei Lazarus weiter helfen? (Delphi, Pascal.)

Beitrag von wennerer »

Hallo dmant,
so ganz weiß ich nicht was du machen willst, aber probiere mal diesen Code:

Code: Alles auswählen


unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs,StdCtrls,Extctrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1 : TButton;
    MyFrame : TFrame;
    Timer1  : TTimer;
    procedure FormCreate(Sender: TObject);
    procedure oeffneFrame1(Sender: TObject);
    procedure OnTimer(Sender: TObject);

  private

  public

  end;

var
  Form1: TForm1;
  i : integer = 0;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 self.Left:=50;
 self.Top:=50;
 self.Width:=800;
 self.Height:=600;

 Button1   := TButton.Create(self);
 Button1.Parent  := self;
 Button1.Left:=20;
 Button1.Top:=20;
 Button1.Width:=100;
 Button1.Height:=30;
 Button1.Caption:='Öffne MyFrame';
 Button1.OnClick:=@oeffneFrame1;

 Timer1 := TTimer.Create(self);
 Timer1.Enabled:=false;
 Timer1.Interval:=1000;
 Timer1.OnTimer:=@OnTimer;
end;

procedure TForm1.oeffneFrame1(Sender: TObject);
begin
 MyFrame   := TFrame.Create(self);
 MyFrame.Parent:=self;
 MyFrame.Left:=20;
 MyFrame.Top:=80;
 MyFrame.Height:=400;
 MyFrame.Width:=700;
 MyFrame.Color:=clwhite;

 Timer1.Enabled:=true;

end;

procedure TForm1.OnTimer(Sender: TObject);
begin
 inc(i);self.Caption:=inttostr(i);
 if i= 5 then
  begin
  MyFrame.Destroy;
  Timer1.Enabled:=false;
  i:=0;
end;
end;

end.
      
Alle Objekte werden zur Laufzeit erstellt, brauchst nichts im OI zusammen klicken.
Kopiere das in eine neue Anwendung in die Unit und klicke im ObjektInspektor bei Ereignisse mal in das OnCreate. Dann sollte es laufe.
Viel Spaß damit.
Bernd

dmant
Beiträge: 3
Registriert: So 3. Mai 2020, 19:55

Re: Kann mir jemand bei Lazarus weiter helfen? (Delphi, Pascal.)

Beitrag von dmant »

Ich habe in der Zeit jetzt auch ein wenig gemacht und getan und versucht und...

jaa..
ich habe es jetzt so zum laufen bekommen:

gui.pas

Code: Alles auswählen

unit gui;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  boot, home;

type

  { TForm1 }

  TForm1 = class(TForm)
  Panel1: TPanel;

  procedure FormCreate(Sender: TObject);

  private

  public
    Frame: TFrame;
    procedure MyMethod(Param1:Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Frame.Free;
  Frame := TFrame1.Create(Self);
  Frame.Parent:= Panel1;
end;

procedure TForm1.MyMethod(Param1:Integer);
begin
  Frame.Destroy;
  if Param1 = 0 then
  begin
    Frame := TFrame3.Create(Self);
    Frame.Parent:= Panel1;
  end;
end;

end.

boot.pas

Code: Alles auswählen

unit boot;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, StdCtrls, ExtCtrls, ComCtrls;

type

  { TFrame1 }

  TFrame1 = class(TFrame)

    Image1: TImage;
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
  procedure Timer1Timer(Sender: TObject);

  private
    MyObj: TObject;
    progressInt : Integer;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
  end;


implementation

uses
  gui;
{$R *.lfm}

{ TFrame1 }

destructor TFrame1.Destroy;
  begin
    MyObj.Free;
    inherited Destroy;
  end;

procedure TFrame1.Timer1Timer(Sender: TObject);
begin
     progressInt:= progressInt + 20;
     ProgressBar1.Position:= progressInt;
     if progressInt=100 then
     begin
       Form1.MyMethod(0);
     end;


end;

constructor TFrame1.Create(TheOwner: TComponent);
  begin
    inherited Create(TheOwner);
    MyObj := TObject.Create;
  end;

end.

home.pas

Code: Alles auswählen

unit home;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, ExtCtrls, StdCtrls;
var
  year, month, day, hr, min, sec, ms: Word;
type

  { TFrame3 }

  TFrame3 = class(TFrame)
    Image1: TImage;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    MyObj: TObject;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

uses
  gui;

{$R *.lfm}

{ TFrame3 }

destructor TFrame3.Destroy;
  begin
    MyObj.Free;
    inherited Destroy;
  end;

procedure TFrame3.Timer1Timer(Sender: TObject);
begin
  DecodeTime(Time,hr, min, sec, ms);
  StaticText1.Caption := format('%.2d',[hr]) + ':' + format('%.2d', [min]);
  DecodeDate(Date,year,month,day);
  StaticText2.Caption := format('%.2d',[day]) + '.' + format('%.2d', [month]) + '.' + format('%.2d', [year]);

end;

constructor TFrame3.Create(TheOwner: TComponent);
  begin
    inherited Create(TheOwner);
    MyObj := TObject.Create;
    DecodeTime(Time,hr, min, sec, ms);
    StaticText1.Caption := format('%.2d',[hr]) + ':' + format('%.2d', [min]);
    DecodeDate(Date,year,month,day);
    StaticText2.Caption := format('%.2d',[day]) + '.' + format('%.2d', [month]) + '.' + format('%.2d', [year]);
  end;

end.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4223
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Kann mir jemand bei Lazarus weiter helfen? (Delphi, Pascal.)

Beitrag von af0815 »

Ich hoffe ihr habt diese Einstellungen getroffen beim Programmieren. Dann sieht man wenigstens was für Speicherleichen entstehen können. Besonders wenn man Objekte zur Laufzeit erzeugt.
Debuggen.JPG
Debuggen.JPG (78.84 KiB) 797 mal betrachtet
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten