Entwickler-Ecke
Sonstiges (Delphi) - Werte sortieren
GericasS - Mo 08.12.08 20:58
Titel: Werte sortieren
Abend,
ich habe folgendes Problem :
2 Array of Integer (Für eine Aritkel Nummer und den Lagerbestand der Ware)
1 Array of String (Artikelbeschreibung)
jetzt möchte ich, wenn ich eins der beiden Integer Arrays mit meinem Bubblesort sortiere und im StringGrid ausgeben ( vorher sind die Daten alle unsortiert), das die Werte der beiden anderen Arrays jeweils auch sortiert werden und so die zusammen gehörenden Werte auch in der gleichen Reihe im StringGrid stehen.
Ich hoffe ich konnte mich verständlich ausdrücken :roll:
Ich dachte da an sowas etwas
Delphi-Quelltext
1:
| procedure Swap(var X,Y : Integer; S : String); |
Mfg,
GericasS
Narses - Di 09.12.08 00:38
Moin!
Warum die Daten verstreuen, mach doch ein Record aus deinem Artikel, der aus Nummer, Bestand und Name besteht. Dann ist das Sortieren/Tauschen doch ganz einfach. :idea: ;)
cu
Narses
GericasS - Do 18.12.08 19:38
Abend,
das Record ist glaube nicht das was ich brauche, folgendes :
Delphi-Quelltext
1: 2: 3: 4: 5:
| var Form2: TForm2; artnA : array [0..5] of Integer ; artbA : array [0..5] of String ; lagbA : array [0..5] of Integer ; |
Diese drei array habe ich, werden auch alle mit den Werten die sie brauchen befüllt.
Jetzt habe ich ein StringGrid wo diese ausgeben werden.
In der ersten Zeile die Artikel Nummer in der zweiten die Artikel Bezeichnung und in der letzten der Lagerbestand.
Jetzt möchte ich, das wenn ich angebe das nach Lagerbestand mit meinem Bubblesort sortiert werden soll, sich die zu den einzelnen Lagerbeständen gehörenden Werte ( der anderen Arrays ) mit verschieben also immer die zusammengehörenden Werte in einer Zeile stehen.
Grüße
GericasS
jfheins - Do 18.12.08 19:52
Da die Array ja globale Variabelen sind: Übergebe der Swap-Funktion nur die Indizies und tausche dann die Werte in allen Arrays.
Besser:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TArtikel = record artn: Integer; artb: String; lagb: Integer; end;
var Form2: TForm2; Artikel : array [0..5] of TArtikel; |
GericasS - Do 18.12.08 21:07
jfheins hat folgendes geschrieben : |
Da die Array ja globale Variabelen sind: Übergebe der Swap-Funktion nur die Indizies und tausche dann die Werte in allen Arrays.
Besser:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TArtikel = record artn: Integer; artb: String; lagb: Integer; end;
var Form2: TForm2; Artikel : array [0..5] of TArtikel; | |
Also meine Swap Funktion ist ja mein BubbleSort oder ?
platzwart - Do 18.12.08 21:49
Nein! Swap vertauscht in der Regel nur zwei Werte. BubbleSort greift auf Swap zurück, um zwei Werte zu vertauschen, falls dies geschehen soll...
GericasS - Do 18.12.08 23:07
platzwart hat folgendes geschrieben : |
| Nein! Swap vertauscht in der Regel nur zwei Werte. BubbleSort greift auf Swap zurück, um zwei Werte zu vertauschen, falls dies geschehen soll... |
Sry, stimmt hatte ich vergessen...btw wäre es möglich mit Swap gleich alle Werte aufeinmal zu tauschen ?
jaenicke - Do 18.12.08 23:14
Wie meinst du das? Swap tauscht ja nur einen Eintrag mit einem anderen. Das Vertauschen wird ja dann erst beim Ablaufen des Algorithmus durchgeführt, und das mehrfach hintereinander.
platzwart - Do 18.12.08 23:47
Genauso ist es. Du schreibst einen Algorithmus zum Sortieren. DIESEN rufst du dann genau einmal auf. Intern wird dieser Algorithmus immer wieder SWAP aufrufen...
Ich hab das Gefühl, deine Frage ist eher, wie ein Sortieralgorithmus ausschaut?!?
GericasS - Fr 19.12.08 07:48
Gute Morgen =),
nein also den Algo. hab ich schon, das Programm habe ich hochgeladen schaut es euch mal an :wink:
ich hoffe dann kommt mein Problem verständlicher rüber..
LG
GericasS
jfheins - Fr 19.12.08 10:30
Aha - beim Klick auf sortieren passiert zwar nichts, aber immerhin ist der Algo schon da uund der Button auch :mrgreen:
Ich würde folgendes vorschlagen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls,iniFiles;
type TForm2 = class(TForm) StringGrid1: TStringGrid; Edit1: TEdit; Button1: TButton; Edit2: TEdit; Button2: TButton; RadioButton1: TRadioButton; RadioButton2: TRadioButton; Button3: TButton; Button4: TButton; Edit3: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Display(); private public end;
TArtikel = record artNr: Integer; artB: String; lagB: Integer; end;
var Form2: TForm2; ArtikelListe: array[0.5] of TArtikel: count : Integer;
implementation
{$R *.dfm}
procedure TForm1.Display(); var i: Integer; begin
for i = 0 to 5 do begin StringGrid1.Cells[0,i] := ArtikelListe[i].artNr; StringGrid1.Cells[1,i] := ArtikelListe[i].artB; StringGrid1.Cells[2,i] := ArtikelListe[i].lagB; end; end;
procedure LoadStringGridFromFile(StringGrid: TStringGrid; const FileName: string); var F: TStringList; i: Integer; begin F := TStringList.Create; try F.LoadFromFile(FileName); StringGrid.RowCount := StrToInt(F[0]); StringGrid.ColCount := StrToInt(F[1]); for i := 0 to (StringGrid.RowCount - 1) do StringGrid.Rows[i].CommaText := F[i + 2]; finally F.Free; end; end;
procedure SaveStringGridToFile(StringGrid: TStringGrid; const FileName: string); var F: TStringList; i: Integer; begin F := TStringList.Create; try F.Add(IntToStr(StringGrid.RowCount)); F.Add(IntToStr(StringGrid.ColCount)); for i := 0 to (StringGrid.RowCount - 1) do F.Add(StringGrid.Rows[i].CommaText); F.SaveToFile(FileName); finally F.Free; end; end;
procedure BubbleSort(var data: array of TArtikel ); var ready : boolean ; i,temp : Integer ; begin repeat ready := true ; for i := 0 to 5 -1 do begin if data[i].artNr > data[i+1].artNr then begin temp := data[i]; data[i]:= data[i+1]; data[i+1] := temp ; ready := false ; end; end; until ready ; end;
procedure TForm2.Button1Click(Sender: TObject); var artbe : String ; artnr,lagbe : Integer ; begin inc(count); ArtikelListe[count].artNr := StrToIntDef(Edit1.Text,0); ArtikelListe[count].artB := Edit2.Text ArtikelListe[count].lagB := StrToIntDef(edit3.Text,0) Display(); if count = 5 then begin showmessage('Datenbank ist voll'); end; end;
procedure TForm2.Button2Click(Sender: TObject); begin BubbleSort(ArtikelListe); Display(); end;
procedure TForm2.Button4Click(Sender: TObject); begin LoadStringGridFromFile(StringGrid1,'StringGridData'); end;
procedure TForm2.FormCreate(Sender: TObject); var i : Integer ; begin StringGrid1.Cells[0,0]:='Art.-Nr'; StringGrid1.Cells[1,0]:='Art.-Bezeichnung'; StringGrid1.Cells[2,0]:='Lagerbestand'; end;
end. |
Die Datenhaltung erfolgt nun in dem Array mit den records und nicht mehr in dem Stringgrid.
Die Laden/Speichern-Prozeduren müssen noch angepasst werden ;)
P.S. Es compilier bestimmt nicht, da ich hier kein Delphi habe und das in Notepad editiert habe. Das Zeil sollte trotzdem erkennbar sein ... :mrgreen:
XUDO - Sa 20.12.08 15:43
Hallo GericaS,
hier kommt ein ganz anderer Vorschlag,
der auch bei gleichen Beständen die Artikel auseinanderhält.
Ich hoffe, die Kommentare reichen fürs Verständnis aus.
XUDO
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!