AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unterprogramm mit Stringgrid

Ein Thema von floralis · begonnen am 17. Aug 2006 · letzter Beitrag vom 28. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
floralis

Registriert seit: 3. Aug 2006
5 Beiträge
 
#1

Unterprogramm mit Stringgrid

  Alt 17. Aug 2006, 14:04
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]
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Unterprogramm mit Stringgrid

  Alt 17. Aug 2006, 14:15
Hallo und willkommen in der 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"
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Unterprogramm mit Stringgrid

  Alt 17. Aug 2006, 16:14
Hallo floralis,

Zitat von floralis:
Nun müssen wir als Beleg daraus ein Unterprogramm machen. ... Wer kann mir da helfen und ggf. ein richtiges Unterprogramm liefern???
gibt es etwas schöneres als den Erfolg aus eigener Kraft? Ich will dich jetzt nicht um dieses Erlebnis bringen, aber ein paar Hinweise sollst du bekommen.

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.

procedure MinMax(sg: TStringGrid; iCol: Integer; var iMin, iMax: Integer); 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.

Leg los - du schaffst das.

Grüße vom marabu
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#4

Re: Unterprogramm mit Stringgrid

  Alt 17. Aug 2006, 17:34
Ergänzend möchte ich auf folgendes Problem mit Variablen-Namen hinweisen:
Zitat von floralis:
Delphi-Quellcode:
procedure TForm1.ButtonBerechneClick(Sender: TObject);
var name, vorn, kname, kvorn, gname, gvorn :string[20];
groesse, kgroesse, ggroesse, i :smallInt;
begin...
Die Formatierung zeigt schon, dass "name" ein besonderer Bezeichner ist. So gibt es im Formular ebenfalls eine Eigenschaft "Name". Der Compiler kann zwar (in Grenzen) entscheiden, welche Bezeichnung wann gültig ist; es kann aber den Programmierer bei der Fehlersuche verzweifeln lassen, wenn der Compiler etwas ganz anderes meint als der Entwickler glaubt.

Ich empfehle deshalb, sich weiterhin an der Ungarischen Notation zu orientieren (auch wenn z.B. NET davon teilweise abgeht und ich deswegen hier auch schon kritisiert wurde):
Delphi-Quellcode:
var sName, sVorname, sKleinName, sKleinVorname, sGrossName, sGrossVorname :string[20];
iGroesse, iMin, iMax, i: smallInt;
begin...
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.

Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
floralis

Registriert seit: 3. Aug 2006
5 Beiträge
 
#5

Re: Unterprogramm mit Stringgrid

  Alt 18. Aug 2006, 16:38
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????
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Unterprogramm mit Stringgrid

  Alt 18. Aug 2006, 17:23
procedure MinMax(sg: TStringGrid; iCol: Integer; var iMin, iMax: Integer; var iName_max, iVorName_min, iName_min, iVorName_min:String); Der Aufruf sollte dann so aussehen:

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
Klaus
  Mit Zitat antworten Zitat
floralis

Registriert seit: 3. Aug 2006
5 Beiträge
 
#7

Re: Unterprogramm mit Stringgrid

  Alt 21. Aug 2006, 13:27
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Unterprogramm mit Stringgrid

  Alt 21. Aug 2006, 13:33
Korrigiere deinen Post unter Verwendung von Delphi-Tags
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Unterprogramm mit Stringgrid

  Alt 21. Aug 2006, 17:12
Hallo floralis,

Zitat von floralis:
Ich hoffe, dass es auch korrekt ist?
hast du dein Programm denn noch nicht selbst ausprobiert?

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
  Mit Zitat antworten Zitat
floralis

Registriert seit: 3. Aug 2006
5 Beiträge
 
#10

Re: Unterprogramm mit Stringgrid

  Alt 28. Aug 2006, 20:21
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:
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;
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?
Mit der Bemerkung: "in der Prozedur überschreibst du den Wert zweimal unnötigerweise..." kann ich erstmal nichts anfgangen?
Danke schon mal im Voraus!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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