Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Proceduren erstellen (https://www.delphipraxis.net/162439-proceduren-erstellen.html)

Marcel2906 23. Aug 2011 09:41

Proceduren erstellen
 
Hey Leute,

ich habe ein Programm geschrieben, welches die Funktionen einer Bus Anzeigetafel hat.
Nun sollte ich das löschen, die Ausgabe an listbox und das sortieren in einer eigenen Procedure machen.
Doch so etwas hab ich noch nie gemacht, darum hab ich mich mal im iNet schlau gemacht. Für das sortieren hat es auch geklappt, doch die anderen beiden Proceduren gehen nicht. Anscheinend kann ich in diesen Proceduren meine ListBox nicht benutzen.
Hoffentlich könnt Ihr mir helfen.

Code:
unit Busanzeige1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    TLabel1: TLabel;
    TLabel2: TLabel;
    TLabel3: TLabel;
    TLabel4: TLabel;
    TLabel5: TLabel;
    Hinzufügen: TButton;
    alleLinien: TButton;
    Linie: TEdit;
    Ziel: TEdit;
    Ankunft: TEdit;
    Abfahrt: TEdit;
    Verspätung: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    bearbeiten: TButton;
    löschen: TButton;
    zehnAnzeigen: TButton;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Beenden: TBitBtn;
    procedure HinzufügenClick(Sender: TObject);
    procedure BeendenClick(Sender: TObject);
    procedure alleLinienClick(Sender: TObject);
    procedure löschenClick(Sender: TObject);
    procedure zehnAnzeigenClick(Sender: TObject);
    procedure bearbeitenClick(Sender: TObject);
end;

type
  TBusEintrag = record
    Linie: string;
    Ziel: string;
    Ankunft: Integer;
    Abfahrt: string;
    Verspätung: Integer;
end;

var
  Form1: TForm1;
  Liste: array of TBusEintrag;
  c,e,f,l,n,x: integer;
  a,b,d,y:string;


implementation

{$R *.dfm}

procedure TDelete;
var
i:integer;
begin
 //x bekommt den Wert der makierten Stelle
 for i := 0 to listbox1.Count - 1 do
  if listbox1.Selected[i] then
   begin
    x:=i;
   end;

//Einträge in Array werden verschoben
while x<high(Liste) do
 begin
  Liste[x]:=Liste[x+1];
  x:=x+1;
 end;
 //Array wird um 1 verringert
 setLength(Liste,Length(Liste)-1);

 //Makierter Eintrag wird aus ListBox entfernt
 ListBox1.DeleteSelected;
end;

procedure TOutput;
   const
      MAX_TABS = 5;
      Tab = #9;
   var
      Tabulators: array[0..MAX_TABS] of Integer;

begin
//neuen Eintrag in Array eintragen
Liste[x].Linie:=a;
Liste[x].Ziel:=b;
Liste[x].Ankunft:=c;
Liste[x].Abfahrt:=d;
Liste[x].Verspätung:=e;
//Tabulatorweiten festlegen
Tabulators[0] := 72;
Tabulators[1] := 136;
Tabulators[2] := 202;
Tabulators[3] := 1;
Tabulators[4] := 1;
Listbox1.TabWidth := 1;

//Tabulatoren setzen
SendMessage(ListBox1.Handle, LB_SETTABSTOPS, MAX_TABS, Longint(@Tabulators));

//ListBox leeren
ListBox1.clear;

//Liste ausgeben
f:=0;
 while ((f < length(Liste)) and (f<10)) do
  begin
   ListBox1.Items.Strings[f]:=' '+Liste[f].Linie
   + Tab +Liste[f].Ziel
   +Tab+Liste[f].Abfahrt+' Uhr'
   +Tab+IntToStr(Liste[f].Verspätung)+Tab+'Minuten';
   f:=f+1;
  end;
end;

procedure TSort;

begin
  if length(Liste)=0 then
 begin
  SetLength(Liste,1);
 end

 //suche Position für neuen Eintrag
 else
  begin
   while (c>Liste[x].Ankunft) and (x < length(Liste)) do
    begin
     x:=(x+1);
    end;

   //Array um 1 erweitern
   SetLength(Liste,length(Liste)+1);
   n:=(high(Liste));

  //Einträge verschieben
   while (n>x) do
    begin
     Liste[n]:=Liste[(n-1)];
     n:=(n-1);
    end;
  end;
end;

procedure TForm1.alleLinienClick(Sender: TObject);

const
  // Die Anzahl der maximal aufretenen Tabs eintragen
  MAX_TABS = 5;
  Tab = #9;

var
  Tabulators: array[0..MAX_TABS] of Integer;

begin
//Tabulatorweiten festlegen
Tabulators[0] := 72;
Tabulators[1] := 136;
Tabulators[2] := 202;
Tabulators[3] := 1;
Tabulators[4] := 1;
Listbox1.TabWidth := 1;

//Tabulatoren setzen
SendMessage(ListBox1.Handle, LB_SETTABSTOPS, MAX_TABS, Longint(@Tabulators));

//ListBox leeren
ListBox1.clear;

//Liste in ListBox eintragen
f:=0;
 while (f < length(Liste)) do
  begin
   ListBox1.Items.Strings[f]:=' '+Liste[f].Linie
   + Tab +Liste[f].Ziel
   +Tab+Liste[f].Abfahrt+' Uhr'
   +Tab+IntToStr(Liste[f].Verspätung)+Tab+'Minuten';
   f:=f+1;
  end;
 end;

procedure TForm1.bearbeitenClick(Sender: TObject);
var
i:integer;

begin
 //x bekommt den Wert der makierten Stelle
 for i := 0 to listbox1.Count - 1 do
  if listbox1.Selected[i] then
   begin
    x:=i;
   end;

//Makierte Linie wird in Editfelder eingetragen
Linie.Text:= Liste[x].Linie;
Ziel.Text:= Liste[x].Ziel;
Ankunft.Text:= IntToStr(Liste[x].Ankunft);
Abfahrt.Text:= Liste[x].Abfahrt;
Verspätung.Text:= IntToStr(Liste[x].Verspätung);

TDelete;
end;

procedure TForm1.BeendenClick(Sender: TObject);
begin
close;
end;

procedure TForm1.löschenClick(Sender: TObject);
begin
  TDelete;
end;

procedure TForm1.zehnAnzeigenClick(Sender: TObject);
const
  // Die Anzahl der maximal aufretenen Tabs eintragen
  MAX_TABS = 5;
  Tab = #9;
var
  Tabulators: array[0..MAX_TABS] of Integer;

begin
//Tabulatorweiten festlegen
Tabulators[0] := 72;
Tabulators[1] := 136;
Tabulators[2] := 202;
Tabulators[3] := 1;
Tabulators[4] := 1;
Listbox1.TabWidth := 1;

//Tabulatoren setzen
SendMessage(ListBox1.Handle, LB_SETTABSTOPS, MAX_TABS, Longint(@Tabulators));

//ListBox leeren
ListBox1.clear;

//Liste ausgeben
f:=0;
 while ((f < length(Liste)) and (f<10)) do
  begin
   ListBox1.Items.Strings[f]:=' '+Liste[f].Linie
   + Tab +Liste[f].Ziel
   +Tab+Liste[f].Abfahrt+' Uhr'
   +Tab+IntToStr(Liste[f].Verspätung)+Tab+'Minuten';
   f:=f+1;
  end;
end;

procedure TForm1.HinzufügenClick(Sender: TObject);
const
  // Die Anzahl der maximal aufretenen Tabs eintragen
  MAX_TABS = 5;
  Tab = #9;
var
  Tabulators: array[0..MAX_TABS] of Integer;

begin
try
//Eingetragene Werte Variablen zuordnen
x:=0;
a:= Linie.Text;
b:= Ziel.Text;
c:= StrToInt(Ankunft.Text);
d:= Abfahrt.Text;
e:= StrToInt(Verspätung.Text);
TSort;
TOutput;

Linie.Clear;
Ziel.Clear;
Ankunft.Clear;
Abfahrt.Clear;
Verspätung.Clear;

except
showmessage('Bitte alle Felder ausfüllen und Ankunft+Verspätung in Minuten angeben');
end;
end;
end.

DeddyH 23. Aug 2011 09:48

AW: Proceduren erstellen
 
Du hast 2 Möglichkeiten:
- Du verwendest weiterhin "reguläre" Prozeduren und musst dann über die globale Formular-Variable auf die Komponenten zugreifen (Form1.ListBox1)
- Du machst Methoden daraus. Methoden gehören zu einem Objekt, so dass Du sie ein wenig anders deklarieren musst.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  ...
    procedure DoDelete;
  ...
  end;

implementation

procedure TForm1.DoDelete; //hier muss das TForm1 davor
begin
  ListBox1.DeleteSelected;
end;

Bummi 23. Aug 2011 09:51

AW: Proceduren erstellen
 
noch einfacher
Delphi-Quellcode:
procedure DoDelete(Ziel:TListbox); //hier muss nichts davor
begin
  Ziel.DeleteSelected;
end;

Marcel2906 23. Aug 2011 09:57

AW: Proceduren erstellen
 
Zitat:

Zitat von Bummi (Beitrag 1118807)
noch einfacher
Delphi-Quellcode:
procedure DoDelete(Ziel:TListbox); //hier muss nichts davor
begin
  Ziel.DeleteSelected;
end;

Ich habe es jetzt so versucht.
Aber was muss ich denn dann aufrufen um diese Procedure in einer anderen zu benutzen?
Ich bekomme immer den Fehler
Zitat:

Nicht genügend wirkliche Parameter

DeddyH 23. Aug 2011 09:57

AW: Proceduren erstellen
 
Und welchen Sinn soll das an dieser Stelle machen? Da versucht man, einen kleinen Schubs in Richtung OOP zu geben... :roll:

ensaron 23. Aug 2011 10:01

AW: Proceduren erstellen
 
Zitat:

Zitat von Marcel2906 (Beitrag 1118809)
Aber was muss ich denn dann aufrufen um diese Procedure in einer anderen zu benutzen?

Du musst die Prozedur mit der Listbox als Parameter aufrufen, also
Delphi-Quellcode:
DoDelete(ListBox1);


Aber mach es lieber so, wie es DeddyH vorgeschlagen hat ;)

Marcel2906 23. Aug 2011 10:05

AW: Proceduren erstellen
 
Nun hab ich es so wie Daddy versucht. Aber nun bekomme ich die Fehlermeldung:

"Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt"

DeddyH 23. Aug 2011 10:07

AW: Proceduren erstellen
 
Wie rufst Du die Methode denn auf?

Luckie 23. Aug 2011 10:08

AW: Proceduren erstellen
 
Nimm die Version von DeddyH, das ist die einzig sinnvolle.

Und eventuell wäre es sinnvoll, sich ein Grundlagentutorial mal anzugucken.

Marcel2906 23. Aug 2011 10:09

AW: Proceduren erstellen
 
Zitat:

Zitat von DeddyH (Beitrag 1118816)
Wie rufst Du die Methode denn auf?

TForm1.DoDelete;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr.
Seite 1 von 3  1 23   

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