Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Rangieren in Delphi über Listen (https://www.delphipraxis.net/114127-rangieren-delphi-ueber-listen.html)

Royale 20. Mai 2008 10:12


Rangieren in Delphi über Listen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie der Titel schon sagt, ein Rangierprogramm mit Delphi über Listen. War ein Unterrichtsproject.




Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, mliste2, ExtCtrls, Buttons;

// *********************************************************************************
// TWaggon

type
    TWaggon = class(TObject)
    public
          Name: string;
end;

// *********************************************************************************
// TGleis

type
    TGleis = class(TStapel)
    public
          // ListBox, in der die aktuelle Belegung des Gleises angezeigt werden soll

          ListBox: TListBox;

          constructor Create; override;

          // Funktionen, die auch die ListBox-Ausgabe ändern müssen

          procedure Push(Element: TObject); override;
          procedure Pop; override;
end;

// ********************************************************************************

type
  TForm1 = class(TForm)
    GleisALbx: TListBox;
    GleisCLbx: TListBox;
    GleisBLbx: TListBox;
    WaggonAnzahlEdt: TEdit;
    Label1: TLabel;
    WaggonsErzeugenBtn: TBitBtn;
    RangierenBtn: TBitBtn;
    Label2: TLabel;
    Label3: TLabel;
    Image1: TImage;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    BitBtn1: TBitBtn;
    Label7: TLabel;
    procedure WaggonsErzeugenBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure RangierenBtnClick(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
   

  private
    { Private-Deklarationen}
  public
    { Public-Deklarationen}
  end;

var
  Form1: TForm1;
  GleisA, GleisB, GleisC: TGleis;

implementation

{$R *.DFM}

// ******************************************************************************
// TGleis

constructor TGleis.Create;
begin
     inherited Create;
     
     ListBox := nil;
end;

procedure TGleis.Push(Element: TObject);
begin
     inherited Push(Element);

     // ggf. Änderung auch in der ListBox ausführen

     if ListBox <> nil then
     begin
          ListBox.items.insert(0, TWaggon(Top).Name);
          ListBox.repaint;
     end;
end;

procedure TGleis.Pop;
begin
     inherited Pop;

     // ggf. Änderung auch in der ListBox ausführen

     if ListBox <> nil then
     begin
          ListBox.items.delete(0);
          ListBox.repaint;
     end;
end;

// *************************************************************************
// annfang

procedure TForm1.FormCreate(Sender: TObject);
begin
     // Gleis-dinger machen

     GleisA := TGleis.create;
     GleisB := TGleis.create;
     GleisC := TGleis.create;

     // Den Gleisen eine ListBox zuweisen

     GleisA.ListBox := GleisALbx;
     GleisB.ListBox := GleisBLbx;
     GleisC.ListBox := GleisCLbx;



     randomize;
end;

// Erzeugen zufälliger Waggon auf A

procedure TForm1.WaggonsErzeugenBtnClick(Sender: TObject);
var
   anzahl, i: integer;
   waggon: TWaggon;
begin
     //  Anzahl der Waggons reintuen

     try
        anzahl := strtoint(WaggonAnzahlEdt.text);
     except
           showmessage('MÖÖP, falsch');
           exit;

     end;


     //*****************************************
     for i := 1 to anzahl do
     begin                                    // Waggons erzeugen


          waggon := TWaggon.create;
          waggon.name := chr(trunc(random(25)) + 65);      //ascci ansprechung der buchstaben

          // Neuen Waggon auf Gleis A hinzufügen.

          GleisA.push(waggon);
     end;
     //*****************************************
end;

// BEGINN SORTIEREN

procedure TForm1.RangierenBtnClick(Sender: TObject);
var
   KleinsterName: string;
begin
     // ausführen, bis fertig
     while not GleisA.IsEmpty do
     begin
          // speichern kleinster waggon um zu wissen welcher auf Gleis C muss und speichern

          KleinsterName := '';

          // alle auf b verschieben :-: den ersten waggon auf a ermitteln beim vorgang



          while not GleisA.IsEmpty do
          begin
               // Name des aktuell ersten Waggons auf Gleis A alphabetisch vor
               // dem bisher alphabetisch kleinsten Namen der verbliebenen
               // Waggons?

               if (KleinsterName = '') or (TWaggon(GleisA.Top).Name < KleinsterName) then
                  KleinsterName := TWaggon(GleisA.Top).Name;

               // waggon von a auf b verschieben
               // und a löschen

               GleisB.Push(GleisA.Top);
               GleisA.Pop;

               // pause zum nachvollziehen

               sleep(100);
          end;

          // Verschieben nach c oder nach a zurück

          while not GleisB.IsEmpty do
          begin
               // Entscheidung a oder c

               if TWaggon(GleisB.Top).Name = KleinsterName then
                  GleisC.Push(GleisB.Top)
               else
                   GleisA.Push(GleisB.Top);

               // und auf B löschen.

               GleisB.Pop;

               // warten zum nachvollziehen

               sleep(100);
          end;
     end;


     {verwendete listenbefehle: push=  element einfügen
                                pop: element aus liste ermitteln und löschen}
end;





procedure TForm1.BitBtn1Click(Sender: TObject);
begin
form1.Close;
end;

end.

RavenIV 20. Mai 2008 10:40

Re: Rangieren in Delphi über Listen
 
Könntest Du bitte den Quellcode auch als Anhang anhängen?

SirThornberry 20. Mai 2008 10:48

Re: Rangieren in Delphi über Listen
 
Hallo Royale :-) Schaue dir bitte noch folgendes an:
Wie Stelle ich mein Programm vor


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz