![]() |
Form wird nach dem compilieren nicht angezeigt
Hallo
Seit kurzem hab ich wieder angefangen mit Delphi zu programmieren und probier zur Zeit hauptsälich eigenen Klassen zu programmieren und so weiter Bei diesem Program wollte ich auch gleich mal die repeat Schleife ausprobieren
Code:
Wenn ich allerdings compelieren wil erscheint das Fenster meines Programmes nicht. Warum kann ich mir denken doch wie kann man des verhindern. (Das Programm ist noch nicht fertig ich wollte es nur mal testen :))
type
TPunkt = class(TObject) private { Private-Deklarationen } rRichtung : Integer; rhoehe : Integer; rpunkt : TPoint; rschliessen : Boolean; // procedure ermmittlehöhe(); public { Public-Deklarationen } procedure Bewegung(); end; TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure onclose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } punkt : TPunkt; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} {procedure TPunkt.ermmittlehöhe; begin rhoehe := form1.ClientHeight; Bewegung(); end;} procedure TPunkt.Bewegung(); begin repeat case rRichtung of 1: begin rpunkt.Y:= rpunkt.Y +1; if rpunkt.Y = rhoehe then rRichtung := 2; end; 2: begin rpunkt.Y:= rpunkt.Y -1; if rpunkt.Y = 0 then rRichtung := 1; end; end; until rschliessen = true; end; procedure TForm1.FormCreate(Sender: TObject); begin punkt := TPunkt.Create; //punkt.ermmittlehöhe; punkt.rpunkt.Y:= 0; punkt.rRichtung:=1; punkt.rhoehe:=form1.ClientHeight; punkt.rschliessen := false; punkt.Bewegung; end; procedure TForm1.onclose(Sender: TObject; var Action: TCloseAction); begin punkt.Free; punkt.rschliessen := true; end; procedure TForm1.Timer1Timer(Sender: TObject); begin showmessage(inttostr(punkt.rpunkt.Y)); end; end. |
AW: Form wird nach dem compilieren
Warum denkst Du denn wird das Formular nicht angezeigt?
Und was könntest Du Dir für Deinen Grund als Alternativmöglichkeiten vorstellen? Spoiler: Noch bevor das Formular das allererste mal gezeichnet wird startest Du eine Endlosschleife. Die lässt dem Formular keine Möglichkeit mehr, die Nachrichten zu verarbeiten die es Zeichnen würden. Ein simples Applicatio.ProcessMessages; würde reichen, macht die Schleife aber wieder rotzlahm. |
AW: Form wird nach dem compilieren
Was steht in der Projektdatei (Menu Projekt > Quelltext anzeigen)?
|
AW: Form wird nach dem compilieren
Code:
@Popov das ist der Code den du meinst oder?
program Project1;
uses Forms, test in 'test.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. @Phoenix ich glaub da ic die Procedure mit der Schleife direct in die oncreate procedure reingeschrieben hab das die Form erst dann erstellt wird wenn die Schleife beendet wurde |
AW: Form wird nach dem compilieren
Zitat:
|
AW: Form wird nach dem compilieren
Rate mal, warum dein Delphi einen Debugger hat?
Denn kann man doch tatsächlich dafür benutzen, um zu schauen warum etwas nicht passiert, bzw. was gerade passiert. PS: [DELPHI]-Tags haben auch ihre Vorteile. Und die Überschrift ... Was wird denn? |
AW: Form wird nach dem compilieren
Danke jetzt wird zumindest mal das messagefeld angezeigt
Zitat:
|
AW: Form wird nach dem compilieren
Zitat:
|
AW: Form wird nach dem compilieren
Wie kann ich den die Schleife verlangsamen?
|
AW: Form wird nach dem compilieren
Zitat:
|
AW: Form wird nach dem compilieren
nein das mit dem Form Zeichnen ist gelöst aber die Schleife ist zu scnel und erfüllt deshalb nicht ihr Ziel
|
AW: Form wird nach dem compilieren
Eine langsamere (Endlos)Schleie braucht länger, also eine Schnelle. :lol:
|
AW: Form wird nach dem compilieren
ja baer wie verlangsamt man eine endlos schleife????
|
AW: Form wird nach dem compilieren
Zitat:
Du stellst hier eine völlig neue Frage. Besser, du erstellst dafür einen neuen Thread. Es erleichtert das Auffinden von Themen enorm, wenn in jedem Thread nur jeweils eine Frage behandelt wird. |
AW: Form wird nach dem compilieren
|
AW: Form wird nach dem compilieren
Zitat:
|
AW: Form wird nach dem compilieren
habs jetzt mit slepp gemacht nur vergessen ins forum zu schreiben trotzdem danke :)
|
AW: Form wird nach dem compilieren
Zitat:
Ich würde mal raten, du meinst, sie bräuchte länger, bis der Stack überläuft ... |
AW: Form wird nach dem compilieren
Zitat:
|
AW: Form wird nach dem compilieren
So jetzt hab ich mein Program beihnah zu ende Programmiert und ein Fehler mit wahrscheinlich gleicher ursache tritt auf.
Code:
wenn ich jetzt auf den button klick um mir den ersten kreis zu erstellen bewegt sich nichts weder der kreis noch die shapevom timer1 (die nur zur kontrolle dient)
unit test;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TPunkt = class(TObject) private { Private-Deklarationen } rRichtung : Integer; rhoehe : Integer; rpunkt : TPoint; rschliessen : Boolean; // procedure ermmittlehöhe(); public { Public-Deklarationen } procedure Bewegung(); end; TForm1 = class(TForm) Timer1: TTimer; Timer2: TTimer; Label1: TLabel; Shape1: TShape; Button1: TButton; Timer3: TTimer; procedure FormCreate(Sender: TObject); procedure onclose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer3Timer(Sender: TObject); private { Private-Deklarationen } punkt : TPunkt; sh : array of TShape; shpos : array of TPunkt; anzahl : integer; public { Public-Deklarationen } procedure erstellen(); end; var Form1: TForm1; implementation {$R *.dfm} {procedure TPunkt.ermmittlehöhe; begin rhoehe := form1.ClientHeight; Bewegung(); end;} procedure TPunkt.Bewegung(); var i : integer; begin form1.Timer2.Enabled :=false; repeat case rRichtung of 1: begin rpunkt.Y:= rpunkt.Y +3; if rpunkt.Y > rhoehe-33 then rRichtung := 2; Sleep(25); end; 2: begin rpunkt.Y:= rpunkt.Y -3; if rpunkt.Y < 0 then rRichtung := 1; Sleep(25); end; end; Application.ProcessMessages; until rschliessen = true; end; procedure TForm1.FormCreate(Sender: TObject); begin punkt := TPunkt.Create; //punkt.ermmittlehöhe; punkt.rpunkt.Y:= 0; punkt.rRichtung:=1; punkt.rhoehe:=form1.ClientHeight; punkt.rschliessen := false; timer2.Enabled:=true; end; procedure TForm1.onclose(Sender: TObject; var Action: TCloseAction); var index :word; begin punkt.Free; punkt.rschliessen := true; for index := 0 to anzahl do sh[index].Free; shpos[index].Free; end; procedure TForm1.Timer1Timer(Sender: TObject); begin shape1.Top:= punkt.rpunkt.Y; label1.Caption:=inttostr(punkt.rpunkt.Y); end; procedure TForm1.Timer2Timer(Sender: TObject); begin punkt.Bewegung ; timer3.Enabled:=true; timer2.Enabled :=false; end; procedure TForm1.Timer3Timer(Sender: TObject); var index : word ; begin for index := 0 to anzahl do sh[index].Top := shpos[index].rpunkt.Y; // sh2[index].Bewegung; end; procedure TForm1.Button1Click(Sender: TObject); var X: Integer; begin x:= anzahl+1; setLength(sh, x); setLength(shpos, x); erstellen(); end; procedure TForm1.erstellen; begin shpos[anzahl]:= TPunkt.Create; sh[anzahl]:= TShape.Create(self); sh[anzahl].Parent:= self; sh[anzahl].Brush.Color:= clred; sh[anzahl].Shape:= stcircle; sh[anzahl].Top :=shpos[anzahl].rpunkt.Y; sh[anzahl].Left := random(200); sh[anzahl].Height:= 33; sh[anzahl].Width:= 33; shpos[anzahl].Bewegung(); end; end. |
AW: Form wird nach dem compilieren
Also, mal ganz langsam zum mitschreiben: Du hast eine REPEAT-Schleife, die erst beendet wird, wenn die Variable rschliessen, die du im FormCreate auf FALSE setzt, TRUE geworden ist. Kannst du mir erklären, wo innerhalb deiner Schleife diese Variable den Wert TRUE erhalten soll?
Delphi-Quellcode:
Eine Endlos-Schleife ist eine Schleife, deren Endbedingung niemals eintritt.
repeat
case rRichtung of 1: begin // rRichtung := 1 rpunkt.Y:= rpunkt.Y +3; if rpunkt.Y > rhoehe-33 then rRichtung := 2; Sleep(25); end; 2: begin // rRichtung := 2 rpunkt.Y:= rpunkt.Y -3; if rpunkt.Y < 0 then rRichtung := 1; Sleep(25); end; end; // case rRichtung of Application.ProcessMessages; until rschliessen = true; // wo wird rschließen TRUE??? end; |
AW: Form wird nach dem compilieren
rschliessen wird true wenn die anwendung geschlossen wird :) deshalb heisst es ja auch so
|
AW: Form wird nach dem compilieren
Zitat:
|
AW: Form wird nach dem compilieren
Zitat:
|
AW: Form wird nach dem compilieren
Zitat:
Delphi-Quellcode:
Hier fehlen noch der Contructor und eine zeichen-Methode so ungefähr:
type
TPunkt = class(TObject) private { Private-Deklarationen } rRichtung : Integer; rhoehe : Integer; rpunkt : TPoint; rschliessen : Boolean; // procedure ermmittlehöhe(); public { Public-Deklarationen } procedure Bewegung(); end; ...
Delphi-Quellcode:
Ich hoffe ich konnte dir bisschen auf die Sprünge helfen ;)
type
TPunkt = class(TObject) private { Private-Deklarationen } rRichtung : Integer; rhoehe : Integer; rpunkt : TPoint; rschliessen : Boolean; // procedure ermmittlehöhe(); public { Public-Deklarationen } procedure Bewegung(); constructor Create(); procedure zeichnen(aCanvas : TCanvas); end; .... constructor TPunkt.Create(); begin // punkte initialisieren und vielleicht Farbe noch setzen end; procedure TPunkt.zeichnen(aCanvas : TCanvas); begin aCanvas.brush.color := clRed; // ? aCanvas.ellipse(deine TPunktkoordinaten); end; ... |
AW: Form wird nach dem compilieren
Nein mit der Classe TPunkt will ich keine Shape zeichnen sie soll lediglich die x oder y coordinate eines objektes aus einer anderen classe veränder so das das object eben hoch und runter fährt(oder von links nach rechts und umgekehrt).
|
AW: Form wird nach dem compilieren
Delphi-Quellcode:
So ich hab jetzt an meinem Programm etwas rum probiert und verbessert jetzt kommen beim Schliessen keine Fehlermeldungen mehr. Wenn ich nun auf den Button klick um das erste shape zu erzeugen Funktioniert alles super es erscheint und fährt so wie es soll hoch und runter. Klick ich nochmal auf den Button bleibt das erste Shape stehen(was es nicht soll) und das Kontroll Shape wird langsamer(das wird immer schlimmer um so öfter man auf den Button klickt um neue Shapes zu erstellen). Ausserdem wen man jetzt die Anwendung schliessen will bleibt das programm einfach stehen.
unit test;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TPunkt = class(TObject) rTimer : TTimer; procedure rTimerTimer(Sender: TObject); private { Private-Deklarationen } rRichtung : Integer; rhoehe : Integer; rpunkt : TPoint; rschliessen : Boolean; // procedure ermmittlehöhe(); public { Public-Deklarationen } constructor Create; destructor Destroy; override; procedure Bewegung(); end; TForm1 = class(TForm) Timer1: TTimer; Label1: TLabel; Shape1: TShape; Button1: TButton; Timer3: TTimer; procedure FormCreate(Sender: TObject); procedure onclose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer3Timer(Sender: TObject); private { Private-Deklarationen } punkt : TPunkt; sh : array of TShape; shpos : array of TPunkt; anzahl : integer; public { Public-Deklarationen } procedure erstellen(); end; var Form1: TForm1; implementation {$R *.dfm} {procedure TPunkt.ermmittlehöhe; begin rhoehe := form1.ClientHeight; Bewegung(); end;} procedure TPunkt.Bewegung(); var i : integer; begin // repeat case rRichtung of 1: begin rpunkt.Y:= rpunkt.Y +3; if rpunkt.Y > rhoehe-33 then rRichtung := 2; Sleep(25); end; 2: begin rpunkt.Y:= rpunkt.Y -3; if rpunkt.Y < 0 then rRichtung := 1; Sleep(25); end; end; Application.ProcessMessages; //until rschliessen = true; end; procedure TForm1.FormCreate(Sender: TObject); begin punkt := TPunkt.Create; //punkt.ermmittlehöhe; end; procedure TForm1.onclose(Sender: TObject; var Action: TCloseAction); begin timer1.Enabled:=false; timer3.Enabled := false; punkt.Free; punkt.rschliessen := true; setlength(sh, 0); setlength(shpos, 0); end; procedure TForm1.Timer1Timer(Sender: TObject); begin shape1.Top:= punkt.rpunkt.Y; label1.Caption:=inttostr(punkt.rpunkt.Y); end; procedure TForm1.Timer3Timer(Sender: TObject); var index : word ; begin for index := 0 to anzahl do begin sh[index].Top := shpos[index].rpunkt.Y; // sh2[index].Bewegung; end; end; procedure TForm1.Button1Click(Sender: TObject); var X: Integer; begin x:= anzahl+1; setLength(sh, x); setLength(shpos, x); erstellen(); end; procedure TForm1.erstellen; begin shpos[anzahl]:= TPunkt.Create; sh[anzahl]:= TShape.Create(self); sh[anzahl].Parent:= self; sh[anzahl].Brush.Color:= clred; sh[anzahl].Shape:= stcircle; sh[anzahl].Top :=shpos[anzahl].rpunkt.Y; sh[anzahl].Left := random(200); sh[anzahl].Height:= 33; sh[anzahl].Width:= 33; shpos[anzahl].rTimer.Enabled:= true; timer3.Enabled:= true; end; constructor TPunkt.Create; begin rpunkt.Y := 0; rRichtung:= 1; rhoehe := form1.ClientHeight; rtimer := TTimer.Create(nil); rtimer.Interval := 25; rtimer.Enabled := true; rtimer.OnTimer := rTimerTimer; end; procedure TPunkt.rTimerTimer(Sender : TObject); begin Bewegung(); end; destructor TPunkt.Destroy; begin rtimer.Enabled := false; rtimer.Free; end; end. Was hab ich falsch gemacht :?: |
AW: Form wird nach dem compilieren
Also ich hab mal weiter experimentiert und jetzt geschafft das das Programm nich immer langsamer wird das andere Problem bleibt aber bestehen. Hier Hab ich mal die Projekt datein
![]() Gruß Arni |
AW: Form wird nach dem compilieren
Weiß keiner ne Antwort? :?:
|
AW: Form wird nach dem compilieren
Tipp: Das Puschen ist innerhalb von 24 Stunden verboten sehr ungern gesehn.
|
AW: Form wird nach dem compilieren
Habs jetzt selber gelöst. In diesem Forum sinkt immer mehr die hilfsbereitschaft !!!!!
|
AW: Form wird nach dem compilieren
Zitat:
|
AW: Form wird nach dem compilieren
Zitat:
Sorry, beim Überfliegen Deiner Fragen und eigenen Antworten konnte ich diese nicht schnell genug nachvollziehen. Und wegen Zeitmangel kann mich gerade nicht länger damit beschäftigen. Kurze, präzise Fragestellungen erhöhen jedenfalls die Chance auf Antworten (und dennoch hast Du doch einige Antworten erhalten)... |
AW: Form wird nach dem compilieren
Zitat:
Also wenn es nicht grade lebensnotwendig ist, wird man doch wohl auch mal 'nen Tag warten können, bis jemand Zeit dafür hat? Und was soll "nicht hilfsbereit" bedeuten? Für mich sieht das hier nicht im Geringsten danach aus. Ich persönlich würde das Verhalten schon fast als beleidigend empfinden. :? |
AW: Form wird nach dem compilieren nicht angezeigt
Zitat:
Mir wurde in diesem Forum schon sehr oft geholfen z.B als ich mein Snake spiel programmierte usw... Dafür bin ich auch sehr dankbar. Und nochmal es war nicht ernst gemeint |
AW: Form wird nach dem compilieren nicht angezeigt
Hallo...
ich weiß ja nicht in welcher Altersgruppe du dich befindest. Tipp: Im Leben muß man manchmal auch mal wissen wann man die Klappe halten sollte. :zwinker: Das ist zwar ernst aber nicht böse gemeint :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz