![]() |
StringGrid nach Kriterien sortieren
Einen wunderschönen guten Tag,
Ich habe mich in letzter Zeit etwas näher mit StringGrid beschäftigt und wollte gerne Zeilen sortieren, doch ich habe noch keine Ahnung wie das gehen soll. Zu dem Problem: Ich habe eine TComboBoxEx in der ich verschiedene Sortierkriterien auswählen kann. In meiner StringGrid stehen nun Werte. Die fixierten Zellen haben zum Beispiel den Inhalt:'Titel' oder 'Interpret'. Neben einem Titel-Wert (also in der gleichen Reihe) steht ein Wert unter 'Interpret'. Jetzt zum Knackpunkt der meine geistige Blockade ist: Wenn ich in meiner TComboBoxEx zum Beispiel auswähle, dass ich nach Titeln sortieren möchte, soll er die Spalte 1 also in der Spalte wo alle Titel stehen sortieren, ABER gleichzeitig die zugewiesenen Werte sich merken und zu dem jeweiligen Titel wieder rechts einfügen. Zu dem Problem ein Screenshot: ![]() Ich hoffe ich habe mein Problem verständlich genug ausgedrückt, ansonsten fragt mich einfach. Mit freundlichen Grüßen Subsidenz |
Re: StringGrid nach Kriterien sortieren
Die Reklame verdeckt sofort das ganze Bild. Kann man keinem zumuten. :twisted: Deshalb : keine Antwort von mir.
|
Re: StringGrid nach Kriterien sortieren
Häng den Screenshot doch als als Anhang an den Beitrag.
|
Re: StringGrid nach Kriterien sortieren
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: StringGrid nach Kriterien sortieren
Es gibt ein TStrings das Grid1.Columns[0] heist.
Das kannst du mit in eine Stringliste kopieren (Verwende tstrings.AddObject() ) bei TStringlist.objects[i] hinterlegst du einen eine Kopie der Zeile (@Record, Objekt, Pchar was auch immer ) Nach erzeugen der Stringlist müstest du sorted auf True stellen. oder nach dem kopieren tStringlist.Sort aufrufen. Jetzt kannst du aus der Stringlist heraus das Gitter neu aufbauen. Die Stringlist benutzt ein auf Listen optimiertes Quicksort. |
Re: StringGrid nach Kriterien sortieren
Zitat:
Hast du da einen Ansatz für mich? (Record Strukturen hab ich nicht so drauf :-D ) MFG Subsidenz |
Re: StringGrid nach Kriterien sortieren
Entweder du nimmst eine Komponente, die dein StringGrid sortiert:
TSortAString Grid v.1.2.0 FWS 10 k 18 Mar 1998 By Johan Godfried. Sort a StringGrid (or any descendant) anyway you like, Horizontal / Vertical, Ascending / Descending, Character / Numeric / Date. Single column sort key only at this time. This is not grid, but for grid. ![]() oder du nimmst gleich ein erweitertes Stringgrid, dass die Sortierfunktionalität schon eingebaut hat: z.B. TSortGrid v2.0 ![]() Ich verwende z.B. das XStringGrid und bin ganz zufrieden damit. (sortieren kann es auch) |
Re: StringGrid nach Kriterien sortieren
Zitat:
Ich möchte eigntlich nur, dass mein Programm, wenn ich den entsprechenden Eintrag in der ComboBoxEx ausgewählt habe, alle Einträge nach diesem Kriterium sortiert. Kann mir da einer einen Code-Schnipsel geben? Oder zumindest entwickeln, den ich auf mein Programm anwenden kann? MFG Subsidenz |
Re: StringGrid nach Kriterien sortieren
Liste der Anhänge anzeigen (Anzahl: 2)
Vielleicht hilft es euch weiter wenn ich mal mein (fast) fertiges Programm uploade. Dann könnt ihr sehen wie das ungefähr funktionieren sollte. (Nur nach dem Prinzip)
Der Quellcode für das komplette Programm:
Delphi-Quellcode:
unit Seite1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, jpeg, ExtCtrls, ComCtrls, TabNotBk, Buttons, iniFiles, Printers; type TForm1 = class(TForm) Hintergrund: TImage; ueberschrift: TLabel; eigenschaften: TGroupBox; ltitel: TLabel; tinterpret: TLabel; tgroesse: TLabel; tlaenge: TLabel; titel: TEdit; interpret: TEdit; album: TEdit; groesse: TEdit; laenge: TEdit; grid: TStringGrid; operatoren: TGroupBox; ein: TButton; close: TBitBtn; spei: TButton; loeschen: TButton; laden: TButton; feld: TEdit; Label1: TLabel; talbum: TLabel; sort: TComboBoxEx; such: TEdit; Suchen: TButton; drucken: TButton; procedure sortChange(Sender: TObject); procedure druckenClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure einClick(Sender: TObject); procedure speiClick(Sender: TObject); procedure ladenClick(Sender: TObject); procedure gridClick(Sender: TObject); procedure feldChange(Sender: TObject); procedure loeschenClick(Sender: TObject); procedure SuchenClick(Sender: TObject); procedure suchClick(Sender: TObject); procedure GridCanSort(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1 : TForm1; ini : TiniFile; a,b,n,i,j,l : Integer; t,z : String; sl,f1 : TStringlist; ar : array[0..1000] of string; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin grid.Cells[0,0]:='Titel'; grid.Cells[1,0]:='Interpret'; grid.Cells[2,0]:='Album'; grid.Cells[3,0]:='Größe in mB'; grid.Cells[4,0]:='Länge in min'; sort.Items.Add('Titel'); sort.Items.Add('Interpret'); sort.Items.Add('Album'); sort.Items.Add('Größe'); sort.Items.Add('Länge'); end; procedure TForm1.einClick(Sender: TObject); begin if grid.Cells[0,grid.RowCount-1]>'' then begin grid.RowCount:=grid.RowCount+1; a:=grid.RowCount-1; grid.Cells[0,a]:=titel.Text; grid.Cells[1,a]:=interpret.Text; grid.Cells[2,a]:=album.Text; grid.Cells[3,a]:=groesse.Text; grid.Cells[4,a]:=laenge.Text; titel.SetFocus; end else begin a:=grid.RowCount-1; grid.Cells[0,a]:=titel.Text; grid.Cells[1,a]:=interpret.Text; grid.Cells[2,a]:=album.Text; grid.Cells[3,a]:=groesse.Text; grid.Cells[4,a]:=laenge.Text; grid.RowCount:=a+1; titel.SetFocus; end end; procedure TForm1.speiClick(Sender: TObject); begin a:=1; n:=0; b:=grid.RowCount-2; t:='t'; for n:=0 to 4 do ini.EraseSection(t+IntToStr(n)); for a:=1 to b+1 do for n:=0 to 4 do ini.WriteString(t+IntToStr(n), IntToStr(a), grid.Cells[n,a]); ShowMessage('Speichervorgang war erfolgreich!'); end; procedure TForm1.ladenClick(Sender: TObject); begin a:=1; n:=0; t:='t'; begin sl := TStringList.Create; try Ini.ReadSectionValues(t+IntToStr(0),sl); b := sl.Count; finally FreeAndNil(sl); end; grid.RowCount:=b+1; for a:=1 to b do for n:=0 to 4 do grid.Cells[n,a]:=ini.ReadString(t+IntToStr(n), IntToStr(a), ''); end; ShowMessage('Ladevorgang war erfolgreich!'); end; procedure TForm1.GridCanSort(Sender: TObject); var aCol: Integer; dosort: Boolean; begin DoSort := ACol > 0; end; procedure TForm1.gridClick(Sender: TObject); begin feld.Text:=Grid.Cells[Grid.col, Grid.Row]; if (grid.Col=0) or (grid.Col=1) or (grid.Col=2) or (grid.Col=3) or (grid.Col=4) then GridCanSort; end; procedure TForm1.feldChange(Sender: TObject); begin grid.EditorMode:=true; Grid.Cells[Grid.col, Grid.Row]:=feld.Text; end; procedure TForm1.loeschenClick(Sender: TObject); begin a:=0; b:=0; if grid.RowCount>2 then begin for b:=0 to grid.RowCount-2 do for a:=0 to 4 do grid.Cells[Grid.Col+a, Grid.Row+b]:=grid.Cells[Grid.Col+a, Grid.Row+1+b]; grid.RowCount:=grid.RowCount-1; end else for a:=0 to 4 do grid.Cells[0+a,1]:=''; end; procedure TForm1.SuchenClick(Sender: TObject); begin i:=0; j:=0; for i:=0 to 5 do for j:=0 to grid.RowCount-1 do if grid.Cells[i,j]=such.Text then begin grid.Col:=i; grid.Row:=j; grid.SetFocus; end; if feld.Text=such.Text then such.Text:='Gefunden!' else such.Text:='kein Eintrag'; such.SetFocus; end; procedure TForm1.suchClick(Sender: TObject); begin such.SelectAll; end; (* Druckalgorithmus von capo (Benutzer von Delphi-PRAXiS Forum) Web-Link: [url]http://www.delphipraxis.net/topic113547.html[/url] *) procedure PrintStringGrid(Grid: TStringGrid; Title: string; Orientation: TPrinterOrientation); var P, I, J, YPos, XPos, HorzSize, VertSize: Integer; AnzSeiten, Seite, Zeilen, HeaderSize, FooterSize, ZeilenSize, FontHeight: Integer; mmx, mmy: Extended; Footer: string; begin //Kopfzeile, Fußzeile, Zeilenabstand, Schriftgröße festlegen HeaderSize := 100; FooterSize := 200; ZeilenSize := 50; FontHeight := 31; //Printer initializieren Printer.Orientation := Orientation; Printer.Title := Title; Printer.BeginDoc; //Druck auf mm einstellen mmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) / GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 25.4; mmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) / GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 25.4; VertSize := Trunc(mmy) * 10; HorzSize := Trunc(mmx) * 10; SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); //Zeilenanzahl festlegen Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize; //Seitenanzahl ermitteln if Grid.RowCount mod Zeilen <> 0 then AnzSeiten := Grid.RowCount div Zeilen + 1 else AnzSeiten := Grid.RowCount div Zeilen; Seite := 1; //Grid Drucken for P := 1 to AnzSeiten do begin //Kopfzeile Printer.Canvas.Font.Height := 50; Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Title) div 2)), - 20,Title); Printer.Canvas.Pen.Width := 3; Printer.Canvas.MoveTo(0, - HeaderSize); Printer.Canvas.LineTo(HorzSize, - HeaderSize); //Fußzeile Printer.Canvas.Pen.Width := 0; Printer.Canvas.Pen.Style := psclear; Printer.Canvas.MoveTo(0, - VertSize + FooterSize); Printer.Canvas.LineTo(HorzSize, - VertSize + FooterSize); Printer.Canvas.Font.Height := 36; Footer := 'Seite: ' + IntToStr(Seite) + ' von ' + IntToStr(AnzSeiten); Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Footer) div 2)), - VertSize + 150,Footer); //Zeilen drucken Printer.Canvas.Font.Height := FontHeight; YPos := HeaderSize + 50; for I := 1 to Zeilen do begin if Grid.RowCount >= I + (Seite - 1) * Zeilen then begin XPos := 280; for J := 0 to Grid.ColCount - 1 do begin Printer.Canvas.TextOut(XPos, - YPos, Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]); XPos := XPos + Grid.ColWidths[J] * 3; end; YPos := YPos + ZeilenSize; end; end; //Seite hinzufügen Inc(Seite); if Seite <= AnzSeiten then Printer.NewPage; end; Printer.EndDoc; end; // <-- Print Procedure procedure TForm1.druckenClick(Sender: TObject); var i:integer ; begin i:=0; if i>0 then begin grid.RowCount:=grid.rowcount+1; end; i:=i+1; PrintStringGrid(grid, 'Musik-Datenbank', poPortrait); end; procedure TForm1.sortChange(Sender: TObject); begin if sort.ItemIndex=1 then end; initialization ini := TIniFile.Create(ExtractFilePath( ParamStr(0))+'data.ini'); finalization ini.Free; end. MFG Subsidenz PS: Wäre nett wenn einer sich mit meinem Problem befassen könnte. Ich habe da nicht so mein Talent. Unbedingt das Programm und die Auslagerungsdatei in einen Ordner packen. |
Re: StringGrid nach Kriterien sortieren
Warum der Umweg über die Combobox ? Ich würde über Klick auf Titelleiste sortieren lassen. Wie das bei einzeiligen Stringgrids geht hat Quickanddirty angedeutet. Mit einzeilig meine ich pro zusammenhängender Wert. Manchmal braucht man mehr Zeilen, um was gut darzustellen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:15 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