Programm schließt sich sofort bei Start

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
milz
Beiträge: 3
Registriert: Fr 5. Apr 2013, 22:35

Programm schließt sich sofort bei Start

Beitrag von milz »

Hallo,

ich hab mir für den Anfang ein simples Programm zur Dreiecksberechnung vorgenommen. Laut der Narichtenbox, ist alles erfolgreich kompiliert, auch ohne Warnungen. Wenn ich aber versuche die exe zu starten kommt nur ein schwarzes Fenster und das schließt sich sofort wieder. :( Ich bin für alle Hinweise zur Lösung sehr dankbar. Vielen Dank im Vorraus!
Da ich keine Ahnung habe, ob der Quelltext bei diesen Problem relevant ist, hab ich den hier mal noch reingestellt:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Interfaces, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, Math;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    btnberechnen: TButton;
    edtgamma: TEdit;
    edtbeta: TEdit;
    edtalpha: TEdit;
    edtc: TEdit;
    edtb: TEdit;
    edta: TEdit;
    edtumfang: TEdit;
    edtflaeche: TEdit;
    edtx1: TEdit;
    edtx2: TEdit;
    edtx3: TEdit;
    edty1: TEdit;
    edty2: TEdit;
    edty3: TEdit;
    Image1: TImage;
    Label1: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    procedure btnberechnenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  x1, x2, x3, y1, y2, y3:Integer;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
 
procedure TForm1.btnberechnenClick(Sender: TObject);
          var  flaeche, a, b, c, s, alpha, beta, gamma:Real;
begin
     x1:=StrToInt(edtx1.Text);
     x2:=StrToInt(edtx2.Text);
     x3:=StrToInt(edtx3.Text);
     y1:=StrToInt(edty1.Text);
     y2:=StrToInt(edty2.Text);
     y3:=StrToInt(edty3.Text);
 
     a:=Sqrt(Sqr(x2-x1)+Sqr(y2-y1));
     b:=Sqrt(Sqr(x2-x3)+Sqr(y2-y3));
     c:=Sqrt(Sqr(x3-x1)+Sqr(y3-y1));
 
     edta.Text:=FloatToStr(a);
     edtb.Text:=FloatToStr(b);
     edtc.Text:=FloatToStr(c);
 
     edtumfang.Text:=FloatToStr(a+b+c);
     s:=(a+b+c)/2;
     flaeche:=Sqrt(s*(s-a)*(s-b)*(s-c));
     edtflaeche.Text:=FloatToSTr(flaeche);
 
     alpha:=ArcCos(((0.5*power(a,2)+0.5*power(b,2)-0.5*power(c,2))/a)/b);
     beta:=ArcCos(((0.5*power(a,2)-0.5*power(b,2)+0.5*power(c,2))/a)/c);
     gamma:=ArcCos(((-0.5*power(a,2)+0.5*power(b,2)+0.5*power(c,2))/b)/c);
     edtalpha.Text:=FloatToStr(RadToDeg(alpha));
     edtbeta.Text:=FloatToStr(RadToDeg(beta));
     edtgamma.Text:=FloatToStr(RadToDeg(gamma));
 
     Image1.Canvas.MoveTo(x1+200,200-y1);
     Image1.Canvas.LineTo(x2+200,200-y2);
     Image1.Canvas.LineTo(x3+200,200-y3);
     Image1.Canvas.LineTo(x1+200,200-y1);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
          var i:Integer;
 begin
      Image1.Canvas.Create;
      Image1.Canvas.Brush.Color := clWhite;
      Image1.Canvas.Fillrect(Image1.Canvas.ClipRect);
 
      with Image1.Canvas do
           begin
                Pen.color:=clBlack;
                moveto(5,305);
                lineto(5,5);
                lineto(2,0);
                moveto(5,5);
                lineto(8,0);
           end;
 
      with Image1.Canvas do
           begin
                Pen.color:=clBlack;
                moveto(0,300);
                lineto(300,300);
                lineto(295,297);
                moveto(300,300);
                lineto(295,303);
           end;
      with Image1.Canvas do
         begin
           i:=0;
           while i<300 do
             begin
                moveto(5+i,303);
                lineto(5+i,207);
                i:=i+25;
                Textout(5+i,300,IntToStr(i));
             end;
         end;
      with Image1.Canvas do
         begin
           i:=0;
           while i<300 do
             begin
                moveto(2,300-i);
                lineto(8,300-i);
                i:=i+25;
                Textout(3,300-i,IntToStr(i));
 
             end;
 
             end;
       form1.show;
 end;
end.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Programm schließt sich sofort bei Start

Beitrag von Michl »

Ich weiss nicht, ob der Code von Dir stammt oder ob das evtl. eine kopierte Hausaufgabe ist, doch der Code ist soweit bis auf ein paar Details (Image1.Canvas.Create ...) i.O. (habe ich gerade kopiert und gestartet - auch die .exe)

Ein ordentlich installiertes Lazarus und eine ordentlich erstellte Form mit den angegebenen Objekten erstellt kein schwarzes Fenster, sondern zeigt es, dem Code entsprechend, an!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: Programm schließt sich sofort bei Start

Beitrag von theo »

Also das geht schon mal überhaupt nicht:

Image1.Canvas.Create;

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Programm schließt sich sofort bei Start

Beitrag von Michl »

Also das geht schon mal überhaupt nicht:

Image1.Canvas.Create;
Ja! Doch der Compiler schluckt das (macht halt ein Speicherleck), bringt aber kein schwarzes Fenster, was ja die Frage war.

...Form1.Show bei Form1.Formcreate macht auch überhaupt keinen Sinn, es sei denn der Code ist irgendwoher kopiert ohne Wissen was da steht, also ists eine Hausaufgabe und diese Frage will dann hier wahrscheinlich niemand beantworten, obwohl die Antwort sehr naheliegend scheint!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: Programm schließt sich sofort bei Start

Beitrag von theo »

Michl hat geschrieben: Ja! Doch der Compiler schluckt das (macht halt ein Speicherleck), bringt aber kein schwarzes Fenster, was ja die Frage war.
Solange solch offensichtlicher Quark im Code steht, gehe ich sicher nicht auf erweiterte Fehlersuche.

milz
Beiträge: 3
Registriert: Fr 5. Apr 2013, 22:35

Re: Programm schließt sich sofort bei Start

Beitrag von milz »

Danke erstmal für die schnelle Hilfe!
Also der code ist auf jeden Fall von mir. Ok das mit dem form.show nemm ich raus. Dachte man muss sowas machen damit der was anzeigt.
Auch wenn das "Image1.Canvas.Create;" nicht der Fehler ist, wüsste ich gerne, wieso das nicht so gut ist?!
Ich werde versuchen ein neues Programm zu machen und dann den Programmcode zu kopieren.

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

Re: Programm schließt sich sofort bei Start

Beitrag von theo »

milz hat geschrieben: Auch wenn das "Image1.Canvas.Create;" nicht der Fehler ist, wüsste ich gerne, wieso das nicht so gut ist?!
Die Frage ist, was das überhaupt sein soll.

Wie kommst du auf die Idee, dem Image seinen Canvas createn zu müssen?
Und falls du das wirklich müsstest, ginge es nicht so wie du es machst, sondern wie immer so:

Image1.Canvas:=TCanvas.Create(..

Ausserdem ist OnCreate zeichnen nicht gut.
Frühestens OnShow, aber noch besser im dafür gedachten Ereignis OnPaint

milz
Beiträge: 3
Registriert: Fr 5. Apr 2013, 22:35

Re: Programm schließt sich sofort bei Start

Beitrag von milz »

Also theo ich hab dein Kommentar nicht 100% verstanden, aber wenn ich dich richtig verstanden habe kann das weglassen. Dachte ich muss das initialisieren. Hast du auch ein Link zu einem leichtverständlichesn Tutorial für das was du mir vermitteln wolltest?
Und das Problem ist "gelöst", ich hab einfach ein neues Projekt gemacht. Auch wenn ich nicht verstehe warum, funktioniert es jetzt einwandfrei, man sieht jetzt bloß einige offentsichtliche Fehler. :mrgreen: Danke nochmal für die Antworten und Hinweise!

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

Re: Programm schließt sich sofort bei Start

Beitrag von af0815 »

In OnCreate hat man die Möglichkeit seine eigenen Objekte zu initialisieren, man kann aber nicht davon ausgehen das fremde Objekte bereits fertig initialisiert sind. Daher von Theo der Hinweis es später zu tun.

OnPaint ist deshalb für selbstgezeichnete Sachen gut, da dieser Event immer dann aufgerufen wird, wenn das System etwas darstellen muß. Bsp. wenn das Fenster geändert wurde.

Man kann davon ausgehen, das jeder Standardevent seine Berechtigung hat, man muß nur wissen, wann man welchen verwendet. :D
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Programm schließt sich sofort bei Start

Beitrag von mse »

theo hat geschrieben:
milz hat geschrieben: Auch wenn das "Image1.Canvas.Create;" nicht der Fehler ist, wüsste ich gerne, wieso das nicht so gut ist?!
Die Frage ist, was das überhaupt sein soll.

Wie kommst du auf die Idee, dem Image seinen Canvas createn zu müssen?
Und falls du das wirklich müsstest, ginge es nicht so wie du es machst, sondern wie immer so:

Image1.Canvas:=TCanvas.Create(..
Das wäre dann mit grosser Wahrscheinlichkeit ein Speicherleck, da Image1.Canvas vermutlich bereits instanziert ist und die setter-Prozedure tcanvas.assign() aufruft. Der Instanz-Pointer des zweiten Objektes ist danach nicht mehr erreichbar.
Klassen Konstruktoren können mit der Instanz als Basis aufgerufen werden, dabei wird mit der bereits bestehenden Instanz gearbeitet und keine neue erstellt.

Code: Alles auswählen

 
var
 canvas1: tcanvas;
[...]
 canvas1:= tcanvas.create;
 canvas1.create;
 
ist korrekt, die create procedure wird einfach zweimal aufgerufen. Dies ist sehr selten sinnvoll, kann aber beispielsweise bei bestimmten Komponenten zur Rückstellung in den Grundzustand verwendet werden.

Edit:
Eine Anwendung aus MSEgui

Code: Alles auswählen

 
function createmodule(aowner: tcomponent; instanceclass: msecomponentclassty;
                                                 var reference): tmsecomponent;
var
 instance: tmsecomponent;
begin
 instance := tmsecomponent(instanceclass.newinstance);
 additem(pointerarty(fmodulestoregister),instance);
                        //submodules call globalfixupreferences
 if @reference <> nil then begin
  tmsecomponent(reference):= instance;
 end;
 try
  instance.create(aowner);
 except
  if @reference <> nil then begin
   tcomponent(reference):= nil;
  end;
  raise;
 end;
 result:= instance;
end;
 

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

Re: Programm schließt sich sofort bei Start

Beitrag von theo »

mse hat geschrieben: Das wäre dann mit grosser Wahrscheinlichkeit ein Speicherleck, da Image1.Canvas vermutlich bereits instanziert ist und die setter-Prozedure tcanvas.assign() aufruft. Der Instanz-Pointer des zweiten Objektes ist danach nicht mehr erreichbar.
Ja, ich glaube ich habe deutlich genug gemacht, dass millz das nicht tun sollte.

Der Rest deines Beitrags ist zwar fachlich richtig, bringt dem User milz aber im Moment nur Verwirrung.

Antworten