![]() |
AW: Warteschlange realisieren
Indem Du neue Daten eingibst und dann erneut einfuegen aufrufst?
|
AW: Warteschlange realisieren
Oh man , stimmt , wieder kompliziert gedacht :)
Also das Programm sieht jetzt so aus :
Delphi-Quellcode:
Jetzt wird, sobald ich in die 2 Edit-Feld Komponenten Namen und ID'S eingebe , das Array gefüllt oder ?
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Tperson = record Name:string; id:integer; end; Tschlange = class private next,max:integer; schlange : array [1..10] of tperson; public function einfuegen(x:tperson):boolean; constructor create; end; var Form1: TForm1; myschlange:Tschlange; myrec : Tperson; i : integer; implementation {$R *.dfm} constructor tschlange.create; begin next :=10; max := 10; end; function tschlange.einfuegen(x: tperson):boolean; begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); end else // wenn next = 0 ist begin for i:=9 downto 1 do schlange[i+1]:=schlange[i]; showmessage('Fehler'); // Test , ob was gemacht wird , wenn next =0 ist end; end; procedure recordirgendwas; begin myrec.Name := form1.edit1.text; myrec.id := strtoint(form1.edit2.text); end; procedure TForm1.Button1Click(Sender: TObject); begin recordirgendwas; end; end. |
AW: Warteschlange realisieren
Das glaube ich nicht, Tim. Du hast MySchlange noch gar nicht erzeugt. Macht aber auch nichts, da Du ihre Methoden ja auch noch nicht aufrufst :mrgreen:
|
AW: Warteschlange realisieren
Danke , stimmt , das hatte ich vergessen, hab aber trotzdem 2 Fehlermeldungen :(
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Tperson = record Name:string; id:integer; end; Tschlange = class private next,max:integer; schlange : array [1..10] of tperson; public function einfuegen(x:tperson):boolean; constructor create; end; var Form1: TForm1; myschlange:Tschlange; myrec : Tperson; i : integer; implementation {$R *.dfm} constructor tschlange.create; begin next :=10; max := 10; end; function tschlange.einfuegen(x: tperson):boolean; begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); end else // wenn next = 0 ist begin for i:=9 downto 1 do schlange[i+1]:=schlange[i]; showmessage('Fehler'); // Test , ob was gemacht wird , wenn next =0 ist end; end; procedure recordirgendwas; begin myschlange := tschlange.create myschlange.free; myschlange.einfuegen(x:person) // [B]Hier sagt er , Booelan und TPerson inkompatibel und er kennt das X nicht [/B] myrec.Name := form1.edit1.text; myrec.id := strtoint(form1.edit2.text); end; procedure TForm1.Button1Click(Sender: TObject); begin recordirgendwas; end; end. |
AW: Warteschlange realisieren
Weißt Du eigentlich, was Du da tust bzw. liest Du, was wir schreiben? Wieviele Instanzen von MySchlange willst Du denn anlegen, die Du nie wieder freigeben kannst? Außerdem schau Dir mein Edit in
![]() [edit] Wenn wir die Reihenfolge der Typdeklarationen etwas ändern, kann die Schlange auch ein Feld des Formulars werden:
Delphi-Quellcode:
Wie schon erwähnt, bis auf die Formularvariable können alle globalen Variablen entfallen. Nur als Denkanstoß. [/edit]
type
Tperson = record Name:string; id:integer; end; Tschlange = class private next,max:integer; schlange : array [1..10] of tperson; public function einfuegen(x:tperson):boolean; constructor create; end; TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } (* FSchlange gehört jetzt dem Formular und ist auch nur von dem zu erreichen *) FSchlange: TSchlange; public { Public declarations } end; //... procedure TForm1.FormCreate(Sender: TObject); begin (* Instanz anlegen *) FSchlange := TSchlange.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin (* Instanz freigeben*) FSchlange.Free; end; |
AW: Warteschlange realisieren
Tut mir Leid , du hattest es ja bearbeitet , dass du es bearbeitet hast , hatte ich nicht gesehen , Entschuldigung.
So , jetzt habe ich keine Fehler mehr :
Delphi-Quellcode:
Damit kann ich jetzt was , in meinen "Verhältnissen" , anfangen oder ?
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Tperson = record Name:string; id:integer; end; Tschlange = class private next,max:integer; schlange : array [1..10] of tperson; public function einfuegen(x:tperson):boolean; constructor create; end; var Form1: TForm1; myschlange:Tschlange; myrec : Tperson; i : integer; implementation {$R *.dfm} constructor tschlange.create; begin next :=10; max := 10; end; function tschlange.einfuegen(x: tperson):boolean; begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); end else // wenn next = 0 ist begin for i:=9 downto 1 do schlange[i+1]:=schlange[i]; showmessage('Fehler'); // Test , ob was gemacht wird , wenn next =0 ist end; end; procedure recordirgendwas; begin myschlange := tschlange.create; myschlange.Free; myschlange.einfuegen(myrec); myrec.Name := form1.edit1.text; myrec.id := strtoint(form1.edit2.text); end; procedure TForm1.Button1Click(Sender: TObject); begin recordirgendwas; end; end. |
AW: Warteschlange realisieren
Ich habe gerade noch einmal editiert. Du kannst doch nicht bei jedem Klick auf den Button eine neue Schlange anlegen, das schafft nur Speicherlecks und führt nicht zum Ziel.
|
AW: Warteschlange realisieren
Danke für den editierten Denkanstoß :)
Ist es jetzt richtig ? Jetzt wird die Klasse direkt instanziiert bei FormCreate , ohne , dass ich auf den Button klicke.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Tperson = record Name:string; id:integer; end; Tschlange = class private next,max:integer; schlange : array [1..10] of tperson; public function einfuegen(x:tperson):boolean; constructor create; end; TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FSchlange : Tschlange; public { Public declarations } end; var Form1: TForm1; myschlange:Tschlange; myrec : Tperson; implementation {$R *.dfm} constructor tschlange.create; begin next :=10; max := 10; end; function tschlange.einfuegen(x: tperson):boolean; var i:integer; begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); end else // wenn next = 0 ist begin for i:=9 downto 1 do schlange[i+1]:=schlange[i]; showmessage('Fehler'); // Test , ob was gemacht wird , wenn next =0 ist end; end; procedure recordirgendwas; begin myschlange.einfuegen(myrec); myrec.Name := form1.edit1.text; myrec.id := strtoint(form1.edit2.text); end; procedure TForm1.Button1Click(Sender: TObject); begin recordirgendwas; showmessage(inttostr(myrec.id)); end; procedure TForm1.FormCreate(Sender: TObject); begin Fschlange := Tschlange.create; end; end. |
AW: Warteschlange realisieren
Schmeiß jetzt endlich die globalen Variablen raus:!: Du gibst FSchlange nicht wieder frei und greifst zum Teil auf myschlange zu, welche es aber nicht gibt. Außerdm finde ich es befremdlich, dass Du aus einer Methode des Formulars heraus eine reguläre Prozedur aufrufst, welche dann wieder auf Felder des Formulars zurückgreift, das ist doch Blödsinn.
|
AW: Warteschlange realisieren
Meinst du so hier :
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Tperson = record Name:string; id:integer; end; Tschlange = class private next,max:integer; schlange : array [1..10] of tperson; public function einfuegen(x:tperson):boolean; constructor create; end; TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FSchlange : Tschlange; myschlange:Tschlange; // Das kann ich eigentlich löschen , oder ? myrec : Tperson; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} constructor tschlange.create; begin next :=10; max := 10; end; function tschlange.einfuegen(x: tperson):boolean; var i:integer; begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); end else // wenn next = 0 ist begin for i:=9 downto 1 do schlange[i+1]:=schlange[i]; showmessage('Fehler'); // Test , ob was gemacht wird , wenn next =0 ist end; end; procedure recordirgendwas; begin myschlange.einfuegen(myrec); myrec.Name := form1.edit1.text; myrec.id := strtoint(form1.edit2.text); end; procedure TForm1.Button1Click(Sender: TObject); begin recordirgendwas; showmessage(inttostr(myrec.id)); end; procedure TForm1.FormCreate(Sender: TObject); begin Fschlange := Tschlange.create; end; procedure TForm1.FormDestroy(Sender: TObject); begin Fschlange.Free; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:16 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