![]() |
Unterprogramm mit Stringgrid
Hallo!
Ich bin Anfänger und muss ein Unterprogramm für eine Minimum / Maximum - suche schreiben. ich habe eine StringGrid, worin Name, Vorname und Größe enthalten sind. Das programm sucht mir die größte und kleinste PErson heraus und zeigt mir Name, Vorname und Größe der kleinsten und größten Person in Editfenster an. Das Programm an sich sieht folgendermaßen aus:
Delphi-Quellcode:
procedure TForm1.ButtonBerechneClick(Sender: TObject);
var name, vorn, kname, kvorn, gname, gvorn :string[20]; groesse, kgroesse, ggroesse, i :smallInt; begin i :=1; name :=StringGrid_Daten.Cells[1,i]; vorn :=StringGrid_Daten.Cells[2,i]; groesse :=StrToInt(StringGrid_Daten.cells[3,i]); gname :=name; kname :=name; gvorn :=vorn; kvorn :=vorn; ggroesse :=groesse; kgroesse :=groesse; name :=StringGrid_Daten.Cells[1,i+1]; while name <> '' do begin vorn :=StringGrid_Daten.Cells[2,i+1]; groesse :=StrToInt(StringGrid_Daten.cells[3,i+1]); if groesse >= ggroesse then begin gname :=name; gvorn :=vorn; ggroesse :=groesse; end; if groesse < kgroesse then begin kname :=name; kvorn :=vorn; kgroesse :=groesse; end; i :=i+1; name :=StringGrid_Daten.Cells[1,i+1]; end; Edit_name_1.Text :=kname; Edit_vorname_1.Text :=kvorn; Edit_groesse_1.Text :=IntToStr(Kgroesse); Edit_name_2.Text :=gname; Edit_vorname_2.Text :=gvorn; Edit_groesse_2.Text :=IntToStr(ggroesse); end; Nun müssen wir als Beleg daraus ein Unterprogramm machen. D.h. ich habe versucht, eine Funktion unter "implementation" zu definieren. Leider sucht mir zwar meine Funktion das Min. und Max, aber liefert die falsche zugehörige Zeile des Stringgrids. WEr kann mir da helfen und ggf. ein richtiges UNterprogramm liefern??? Danke schon mal recht herzlich im Vorfeld! [edit=sakura] [delphi]-Tags. Mfg, sakura[/edit] |
Re: Unterprogramm mit Stringgrid
Hallo und willkommen in der DP :dp:, floralis.
ich blicke bei deinem code im moment nicht ganz durch. ein unterprogramm (oder procedure/function) ist eigentlich nicht schwierig zu machen, könntest du vielleicht einfach zeigen, was du bis jetzt geschrieben hast? in deinem code kann ich kein unterprogramm entdecken. PS: Es lebe das Refactoring... "Methode extrahieren" :lol: |
Re: Unterprogramm mit Stringgrid
Hallo floralis,
Zitat:
Zuerst musst du dir eine Signatur für dein Unterprogramm überlegen. Da es nicht den einen Rückgabewert gibt, der in einer anderen Funktion weiter verwendet werden soll, schlage ich eine Prozedur vor. Dein Unterprogramm muss informiert werden, wo es den kleinsten und den größten Wert suchen muss und wie es das Ergebnis zurückmelden kann.
Delphi-Quellcode:
Mit dieser Signatur werden alle nötigen Informationen übergegeben. Das Grid sg, in dessen Spalte iCol die Werte zu suchen sind, und die Variablen iMin und iMax, in denen der Zeilenindex der gefundenen Extrema zurück gemeldet werden kann.
procedure MinMax(sg: TStringGrid; iCol: Integer; var iMin, iMax: Integer);
Leg los - du schaffst das. Grüße vom marabu |
Re: Unterprogramm mit Stringgrid
Ergänzend möchte ich auf folgendes Problem mit Variablen-Namen hinweisen:
Zitat:
Ich empfehle deshalb, sich weiterhin an der ![]()
Delphi-Quellcode:
Solche "sprechenden Namen" sind sehr nützlich, wenn man sich nach sechs Monaten wieder an ein Programm setzt oder wenn jemand anderes (z.B. ein Lehrer) einen Quelltext lesen und verstehen soll.
var sName, sVorname, sKleinName, sKleinVorname, sGrossName, sGrossVorname :string[20];
iGroesse, iMin, iMax, i: smallInt; begin... Jürgen |
Re: Unterprogramm mit Stringgrid
Hallo marabu,
danke erstmal! ich habe mir deine Hinweise nochmals angesehen...(kann ich immer nur, wenns Baby schläft...) Wie deklariere ich den den Typ TStringGrid? Soll das ein array sein? Dann wüsste ich nicht, welche Variablendeklaration ich dem geben sollte, da integer(Größe) und string (Name) vorkommen? Wenn ich einen record deklariere (type TStringGrid=record.. name:string, vorn:string, groesse:integer..) muss ich damit "TStringGrid.groesse" arbeiten und weis nicht, wie ich da eine Zeile und Spalte angebe???? |
Re: Unterprogramm mit Stringgrid
Delphi-Quellcode:
Der Aufruf sollte dann so aussehen:
procedure MinMax(sg: TStringGrid; iCol: Integer; var iMin, iMax: Integer; var iName_max, iVorName_min, iName_min, iVorName_min:String);
min,max : Integer; NachName_max,VorName_max,NachName_min,VorName_min: String; MinMax(StringGrid_daten,3,min,max,NachName_max,Vor Name_max,NachName_min,VorName_max); Das StringGrid mußt Du doch nicht in Deinem Unterprogramm erstellen, sondern nur benutzen. Wenn Du dann die Prozedure mit Leben füllst sprichst Du das StringGrid mit sg an. Also sg.cells[iCol,<Deine Laufvariable>]. Deine gefunden Maximal- und Minimalwerte übergibst Du iMin und iMax. Diese werden dann nach außen gereicht. Hoffe es hilft Dir ein wenig weiter. Grüße Klaus |
Re: Unterprogramm mit Stringgrid
Danke!
Habe es geschafft...zumindest läuft es mit Unterprogramm. Ich hoffe, dass es auch korrekt ist? procedure MinMax (sg:TStringgrid; iCol:integer ; var iGRoesse_min,iGroesse_max: integer; var iName_max,iVorName_max,iName_min,iVorname_min:stri ng); var x: integer; var iGRoesse: integer; var iName, iVorname:string; begin x :=1; iCol:=1; iName :=sg.Cells[iCol,x]; iVorName :=sg.Cells[iCol+1,x]; iGroesse:=StrToInt(sg.Cells[iCol+2,x]); iName_min :=iName; iVorName_min :=iVorname; iGroesse_min:=iGroesse; iName_max :=iName; iVorName_max :=iVorname; iGroesse_max:=iGroesse; iCol:=1; iName :=sg.Cells[iCol,x+1]; while iName <> '' do begin iVorname :=sg.Cells[iCol+1,x+1]; iGroesse :=StrToInt(sg.Cells[iCol+2,x+1]); if iGroesse >= iGroesse_max then begin iName_max :=iName ; iVorName_max :=iVorname; iGroesse_max :=iGroesse; end; if iGroesse < iGroesse_min then begin iName_min :=iName ; iVorName_min :=iVorname; iGroesse_min :=iGroesse; end; x :=x+1; iName :=sg.Cells[iCol,x+1]; end; end; |
Re: Unterprogramm mit Stringgrid
Korrigiere deinen Post unter Verwendung von Delphi-Tags
|
Re: Unterprogramm mit Stringgrid
Hallo floralis,
Zitat:
Hier noch ein paar Anmerkungen zu deiner Umsetzung: Dein Unterprogramm ist überinformiert, die String-Variablen in der Signatur sind nicht nötig. Die minimale Information ist das Optimum. Der aufrufende Code weiß was er will - den Zeilenindex der Zeile mit dem größten (iMax) bzw. kleinsten (iMin) numerischen Wert in einer bestimmten Spalte (iCol) eines Grids (sg). Mehr sollte das Unterprogramm auch nicht erledigen (information hiding). Bei der Namensgebung hatte dir Jürgen die "ungarische Notation" empfohlen. Das musst du nicht streng befolgen, zumal diese MS-interne Namenskonvention für den C-Compiler erfunden wurde, aber iName als String-Variable muss doch wirklich nicht sein! In iCol übergibst du den Spaltenindex für die Spalte mit dem Ordnungskriterium (Größe), aber in der Prozedur überschreibst du den Wert zweimal unnötigerweise. Bei Vergleichen würde ich eine einheitliche Regel verwenden: Das Maximum (Minimum) wird dann ersetzt, wenn der neue Wert echt größer (kleiner) als der alte ist. Du bist da in deinem Code nicht konsistent. Wenn du alle Hinweise umsetzt, dann ist dein Code hinterher nur noch halb so groß und doppelt so gut lesbar. Grüße vom marabu |
Re: Unterprogramm mit Stringgrid
Hallo!
Ich komme heute erst dazu, mir das gesagte anzuschauen... Wenn ich die String-Variablen weglassen, würde es wie folgt aussehen und hätte einen wesentlichen Fehler:
Delphi-Quellcode:
Es kommt dann eine Fehlermeldung: Inkombatible Typen String - Integer. Da wird die while-SCheilfe angemeckert, weil der Leerstring als String gelesen wird. Ich wüsste nicht, wie ich es schreiben sollte, dass die Schleife solange gehen soll, bis die Zeile leer ist?
procedure MinMax (sg:TStringgrid; iCol:integer ;
var iGRoesse_min,iGroesse_max: integer); var x: integer; var iGRoesse: integer; begin x :=1; iCol:=1; iGroesse:=StrToInt(sg.Cells[iCol+2,x]); iGroesse_min:=iGroesse; iGroesse_max:=iGroesse; iCol:=1; while iGRoesse <> '' do begin iGroesse :=StrToInt(sg.Cells[iCol+2,x+1]); if iGroesse >= iGroesse_max then begin iGroesse_max :=iGroesse; end; if iGroesse < iGroesse_min then begin iGroesse_min :=iGroesse; end; x :=x+1; end; end; Mit der Bemerkung: "in der Prozedur überschreibst du den Wert zweimal unnötigerweise..." kann ich erstmal nichts anfgangen? Danke schon mal im Voraus! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 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