![]() |
AW: Warteschlange realisieren
Zunächst einmal sollte das "create" dort verschwinden, denn wenn Du auf Button1 clickst, dann sollte Dein "Warteschlangenarray schon existieren.
Ich würde ein Record übergeben, etwa so
Delphi-Quellcode:
Du solltest Dir vielleict auch angewöhnen halbwegs sprechende Namen für Deine Variablen und Typen zu benutzen, damit machst Du Dir das Leben etwas einfacher.
var
myrec : tperson; //tperson ist etwas besser als das nackte person begin Myrec.ID:= Edit1.Text; Myrec.Name:=Edit2.Text; MySchlange.Einfuegen(Myrec); ..... z.B. edt_Name oder edt_ID Gruß K-H |
AW: Warteschlange realisieren
So ähnlich hatte ich mir das auch gedacht. Wozu soll man auch einen Record-Parameter deklarieren, den man dann innerhalb der Funktion gar nicht nutzt, sondern stattdessen auf GUI-Controls zugreift? Macht ja keinen Sinn.
|
AW: Warteschlange realisieren
Hallo,
also so sieht es jetzt bei mir aus :
Delphi-Quellcode:
Ist das semantisch richtig ?
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); schlange[next].Name:=x.name; schlange[next].id := x.id; 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
Weshalb trägst Du die Daten denn jetzt 2 mal ein?
[edit]
Delphi-Quellcode:
Wenn Du die ganzen globalen Variablen (außer dem Formular) mal weglässt, wird das viel übersichtlicher. MySchlange könnte auch ein privates Feld des Fornulars werden, welches Du im OnCreate erzeugst und im OnDestroy wieder freigibst.[/edit]
procedure TForm1.Button1Click(Sender: TObject);
var MyRec: TPerson; begin MyRec.Name := Edit1.Text; MyRec.id := StrToInt(Edit2.Text); MySchlange.einfuegen(MyRec); end; |
AW: Warteschlange realisieren
Wo denn , wenn ich fragen darf ?
|
AW: Warteschlange realisieren
Na, hier:
Zitat:
|
AW: Warteschlange realisieren
Naja next ist doch 10 , und wenn ich was eingefügt habe , will ich in ja next 9 was reinmachen , dazu muss ich doch dec benutzen , oder ?
|
AW: Warteschlange realisieren
In ButtonClick ist nichts doppelt.
Doppelt gemoppelt ist eher das hier:
Delphi-Quellcode:
nämlich das 2. Mal Schlange[next].name und Schlange[next].id.
function tschlange.einfuegen(x: person):boolean;
begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; x.Name:= form1.edit1.text; // ERWITERUNG x.id := strtoint(form1.edit2.text); // ERWEITERUNG if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); schlange[next].Name:=x.name; schlange[next].id := x.id; end; end Warum? Weil die Zuweisung bereits bei "Daten an aktuelle Position schreiben" erfolgt. Die 2. Zuweisung darunter erfolgt nicht nur unnötig doppelt, sondern zu allem Überfluss noch nach der Dekrementierung des Index Next. So steht dann der Name mit gleicher ID zwei Mal in der Schlange. Hintereinander. Das geht logisch nicht, ist Fehler, weil eine Person nur einmal in der Schlange stehen kann. Diese kann maximal zu einem späteren Zeitpunkt NACHDEM sie an der Kasse schon bezahlt hat, nochmals kommen. Denn der Name der Person hat sich zwischenzeitlich im Code vor der 2. Zuweisung noch nicht geändert, ist also mit Sicherheit noch dieselbe Person. . |
AW: Warteschlange realisieren
Ja, aber wieso schreibst Du dann in 9 dieselben Daten nochmal?
|
AW: Warteschlange realisieren
Achso ich verstehe den Fehler jetzt.
Aber :
Delphi-Quellcode:
Wenn ich was eingebe die ID und den Namen , dann bin ich ja im 10.Array Feld , denn next ist 10 , und wie kann ich dann Daten ins 9.Array Feld eingeben ?
function tschlange.einfuegen(x: person):boolean;
begin //hinter dem Array kann man nichts mehr einfügen Result := Next >0; x.Name:= form1.edit1.text; // ERWITERUNG x.id := strtoint(form1.edit2.text); // ERWEITERUNG if Result then begin //Daten an aktuelle Array-Position schreiben schlange[Next].Name := x.Name; schlange[Next].Id := x.id; //Position abziehen dec(Next); schlange[next].Name:=x.name; schlange[next].id := x.id; end; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 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