![]() |
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. |
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; |
AW: Proceduren erstellen
noch einfacher
Delphi-Quellcode:
procedure DoDelete(Ziel:TListbox); //hier muss nichts davor
begin Ziel.DeleteSelected; end; |
AW: Proceduren erstellen
Zitat:
Aber was muss ich denn dann aufrufen um diese Procedure in einer anderen zu benutzen? Ich bekomme immer den Fehler Zitat:
|
AW: Proceduren erstellen
Und welchen Sinn soll das an dieser Stelle machen? Da versucht man, einen kleinen Schubs in Richtung OOP zu geben... :roll:
|
AW: Proceduren erstellen
Zitat:
Delphi-Quellcode:
DoDelete(ListBox1);
Aber mach es lieber so, wie es DeddyH vorgeschlagen hat ;) |
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" |
AW: Proceduren erstellen
Wie rufst Du die Methode denn auf?
|
AW: Proceduren erstellen
Nimm die Version von DeddyH, das ist die einzig sinnvolle.
Und eventuell wäre es sinnvoll, sich ein Grundlagentutorial mal anzugucken. |
AW: Proceduren erstellen
Zitat:
|
AW: Proceduren erstellen
Zitat:
![]() |
AW: Proceduren erstellen
Entweder
Delphi-Quellcode:
oder wenn Du es aus einer Methode von Form1 aufrufst einfach
Form1.DoDelete;
Delphi-Quellcode:
DoDelete;
|
AW: Proceduren erstellen
Danke, bin sogar 2 sekunden vorher selber drauf gekommen :oops:
|
AW: Proceduren erstellen
Und nun könnte man noch etwas gegen die vielen Globalen machen. :stupid:
|
AW: Proceduren erstellen
Kann ich jetzt meine Output Procedure auch mit einer Variable benutzen?
Ungefähr so (klappt leider nicht):
Code:
procedure TForm1.Output(g:integer);
const 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<g)) 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; |
AW: Proceduren erstellen
Du meinst mit Parameter bzw. Argument? Natürlich, was klappt denn nicht? BTW: Dein Array ist 1 Element zu groß ;)
|
AW: Proceduren erstellen
Ich bekomme die Fehlermeldung:
Deklaration von 'Output' unterscheidet sich von vorheriger Deklaration
Code:
type
TForm1 = class(TForm) ... procedure Output; end; ... procedure TForm1.Output(g:integer); const 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<g)) 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; |
AW: Proceduren erstellen
Du hast es hier doch schon fast untereinander kopiert:
Delphi-Quellcode:
Fällt dir was auf?
procedure Output;
procedure TForm1.Output(g:integer); |
AW: Proceduren erstellen
Du musst es auch gleich deklarieren.
Delphi-Quellcode:
type
TForm1 = class(TForm) ... procedure Output(g: integer); end; |
AW: Proceduren erstellen
Komisch, vorher hatte ich das so, aber hatte trotzdem eine Fehlermeldung. Nun klappt es...
|
AW: Proceduren erstellen
Leider war diese Lösung falsch, ich soll es mit private machen.
Doch nun bekomme ich sehr viele Fehler, erkennt einer warum, ohne dass ich die Fehler alle benenne?
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); private type TBusEintrag = record Form1: TForm1; Liste: array of TBusEintrag; x: integer; AnkunftPlusVerspätung: TTime; procedure Delete; procedure Output(AnzahlEinträge:integer); procedure Sort; end; end; implementation {$R *.dfm} procedure TForm1.Delete; var i: integer; MakierteStelle: integer; begin //x bekommt den Wert der makierten Stelle for i := 0 to ListBox1.Count - 1 do if ListBox1.Selected[i] then begin MakierteStelle:=i; end; //Einträge in Array werden verschoben while MakierteStelle<high(Liste) do begin Liste[MakierteStelle]:=Liste[MakierteStelle+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 TForm1.Output(AnzahlEinträge:integer); const MAX_TABS = 4; Tab = #9; var Tabulators: array[0..MAX_TABS] of Integer; StelleEintrag: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 StelleEintrag:=0; while ((StelleEintrag < length(Liste)) and (StelleEintrag<AnzahlEinträge)) do begin ListBox1.Items.Strings[StelleEintrag]:=' '+Liste[StelleEintrag].Linie+ Tab +Liste[StelleEintrag].Ziel+Tab+TimeToStr(Liste[StelleEintrag].Abfahrt+Liste[StelleEintrag].Verspätung)+' Uhr'+Tab+TimeToStr(Liste[StelleEintrag].Verspätung)+Tab+'h'; StelleEintrag:=StelleEintrag+1; end; end; procedure TForm1.Sort; var Eintrag:integer; begin if length(Liste)=0 then begin SetLength(Liste,1); end //suche Position für neuen Eintrag else begin while (AnkunftPlusVerspätung>(Liste[x].Ankunft+Liste[x].Verspätung)) and (x < length(Liste)) do begin x:=(x+1); end; //Array um 1 erweitern SetLength(Liste,length(Liste)+1); Eintrag:=(high(Liste)); //Einträge verschieben while (Eintrag>x) do begin Liste[Eintrag]:=Liste[(Eintrag-1)]; Eintrag:=(Eintrag-1); end; end; end; procedure TForm1.alleLinienClick(Sender: TObject); begin Output(length(Liste)); end; procedure TForm1.bearbeitenClick(Sender: TObject); var i:integer; MakierteStelle: integer; begin //x bekommt den Wert der makierten Stelle for i := 0 to listbox1.Count - 1 do if listbox1.Selected[i] then begin MakierteStelle:=i; end; //Makierte Linie wird in Editfelder eingetragen Linie.Text:= Liste[MakierteStelle].Linie; Ziel.Text:= Liste[MakierteStelle].Ziel; Ankunft.Text:= TimeToStr(Liste[MakierteStelle].Ankunft); Abfahrt.Text:= TimeToStr(Liste[MakierteStelle].Abfahrt); Verspätung.Text:= TimeToStr(Liste[MakierteStelle].Verspätung); Delete; end; procedure TForm1.BeendenClick(Sender: TObject); begin close; end; procedure TForm1.löschenClick(Sender: TObject); begin Delete; Output(10); end; procedure TForm1.zehnAnzeigenClick(Sender: TObject); begin Output(10); end; procedure TForm1.HinzufügenClick(Sender: TObject); begin try //Eingetragene Werte Variablen zuordnen x:=0; AnkunftPlusVerspätung:= (StrToTime(Ankunft.Text)+StrToTime(Verspätung.Text)); Sort; //neuen Eintrag in Array eintragen Liste[x].Linie:=Linie.Text;; Liste[x].Ziel:=Ziel.Text; Liste[x].Ankunft:=StrToTime(Ankunft.Text); Liste[x].Abfahrt:=StrToTime(Abfahrt.Text); Liste[x].Verspätung:=StrToTime(Verspätung.Text); Output(10); //Edit Felder leeren Linie.Clear; Ziel.Clear; Ankunft.Clear; Abfahrt.Clear; Verspätung.Clear; except showmessage('Bitte alle Felder ausfüllen oder korrekte Uhrzeit eingeben'); end; end; end. |
AW: Proceduren erstellen
Die Typdeklarationen haben im private-Abschnitt nichts zu suchen.
Delphi-Quellcode:
type
TNeuerTyp = (ntDies, ntDas); TForm1 = class(TForm) ... private procedure DoSomeWork; procedure DoOtherWork; end; |
AW: Proceduren erstellen
Nun habe ich es so, und trotzdem noch Fehler:
Code:
unit Busanzeige1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TBusEintrag = record Form1: TForm1; Liste: array of TBusEintrag; x: integer; AnkunftPlusVerspätung: TTime; 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); private procedure Delete; procedure Output(AnzahlEinträge:integer); procedure Sort; end; implementation {$R *.dfm} |
AW: Proceduren erstellen
Was soll denn genau zum Record gehören?
|
AW: Proceduren erstellen
Ahhh, danke..da ist mein Fehler...irgendwie sind meine Sachen vom Record verloren gegangen :!:
Jetzt schaff ich es alleine, danke schön :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 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