Toon posts:

[Delphi] Stringgrid ordenen

Pagina: 1
Acties:
  • 150 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een programma met stringgrid waarin 3 kolommen zijn: itemnr, omschrijving en prioriteit. Wat ik wil is op een soort windows explorer/outlook manier het mogelijk maken om de gegevens te ordenen door in de fixedrow te klikken en dat je dan zo'n soort pijltje naar beneden er bij krijgt.

Ik denk dat het ordenen programmeren niet echt een probleem is. Wat ik alleen niet echt begrijp is hoe je precies het klikken op die fixed row moet afvangen. Nu krijg ik nog niet het ingedrukt effect, hoe is dit in te stellen? En hoe zorg ik voor die pijltjes in die eerste fixed row of is dit niet mogelijk in een stringgrid?

Verwijderd

Op woensdag 13 maart 2002 21:10 schreef Xenith het volgende:

Ik denk dat het ordenen programmeren niet echt een probleem is. Wat ik alleen niet echt begrijp is hoe je precies het klikken op die fixed row moet afvangen. Nu krijg ik nog niet het ingedrukt effect, hoe is dit in te stellen? En hoe zorg ik voor die pijltjes in die eerste fixed row of is dit niet mogelijk in een stringgrid?
Volgens mij is dat vragen om programmeerwerk, want je zult waarschijnlijk een aantal OnPaint and OnClick achtige dingen moeten invullen met eigen code. Misschien kun je beter bijv. het TAdvStringGrid gebruiken van http://www.tmssoftware.com want dat doet al het werk voor je. Oh, je executable wordt wel een paar honderd kb groter... :)

Verwijderd

Topicstarter
Hmz tsja het is een school opdrachtje (wat ik er nu bij wil hebben is niet echt nodig maar wel leuk om te doen natuurlijk). Ik denk dan ook dat ze het niet echt fijn vinden als ik op eens andere componenten ga gebruiken.

Misschien dat ik het dan toch iets simpeler ga doen door gewoon effe die pijltjes en indrukking van die fixedrow nog niet te maken. Het ordenen zelf lijkt mij eigenlijk niet veel meer dan wat loopjes maken.

  • Wolfensteijn
  • Registratie: Maart 2000
  • Laatst online: 10-09 15:37
Je kunt via een OnMouseUp event van je StringGrid kijken wanneer je ergens op hebt geklikt, en als je dan de X en Y positie van je muis kunt vertalen in een Column en Row nummer kan je daar dus de sorteer code aan hangen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.FormMouseUp(Sender: TObject; Button: 
var
  Rij,Kol: LongInt;

TMouseButton;
  Shift: TShiftState; X, Y: Integer);

begin
  with StringGrid1 do
  begin
    MouseToCell (X,Y,Kol,Rij);
    if (Rij>0) and (Rij<RowCount) then
     begin
     Edit3.Text := IntToStr(Speler[Rij].VolgNummer);
     Edit2.Text := Speler[Rij].Naam;
     end
    else
    begin
    Edit3.Text := Edit3.Text;
    Edit2.Text := Edit2.Text;
    end;
    end;
end;

Dit is een voorbeeldje uit iets waar ik nu mee bezig ben, ik denk dat je zelf ff moet zoeken voor een duidelijker voorbeeld.

Ben namelijk nog niet zo lang bezig met Delphi ;).

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23:42

Tomatoman

Fulltime prutser

Je kunt in plaats van een TStringGrid een TListView gebruiken met ViewStyle = vsReport en SortType = stBoth. Vervolgens schrijf je een event handler voor OnCompare. Die wordt aangeroepen voor iedere twee items die ten opzichte van elkaar gesorteerd moeten worden. De parameter Compare geeft daarbij aan welk item boven de ander moet komen. Compare < 0 betekent: Item1 moet komen vóór Item2.

Stel dat je wilt sorteren op de eerste kolom, die zowel tekst als getallen kan bevatten. Dat doe je zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TServers.ListViewCompare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
var
  Sub1, Sub2: string;
begin
  { Voorbeeld:
    We gaan eerst kijken of beide items een getal zijn. Zo ja, dan
    komt het kleinste getal bovenaan. }
  Sub1 := Item1.Caption;
  Sub2 := Item2.Caption;
  try
    // StrToInt geeft een exception als Sub1 of Sub2 een string is.
    Compare := StrToInt(Sub1) - StrToInt(Sub2);
  except
    // Tenminste 1 item bevat tekst. Daar ga we nu op sorteren.
    Compare := AnsiCompareStr(Sub1, Sub2);
  end;
end;

Een goede grap mag vrienden kosten.


  • johnny7
  • Registratie: November 2000
  • Laatst online: 07-11-2023
Op zondag 07 april 2002 11:04 schreef Wolfensteijn het volgende:
Je kunt via een OnMouseUp event van je StringGrid kijken wanneer je ergens op hebt geklikt, en als je dan de X en Y positie van je muis kunt vertalen in een Column en Row nummer kan je daar dus de sorteer code aan hangen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.FormMouseUp(Sender: TObject; Button: 
var
  Rij,Kol: LongInt;

TMouseButton;
  Shift: TShiftState; X, Y: Integer);

begin
  with StringGrid1 do
  begin
    MouseToCell (X,Y,Kol,Rij);
    if (Rij>0) and (Rij<RowCount) then
     begin
     Edit3.Text := IntToStr(Speler[Rij].VolgNummer);
     Edit2.Text := Speler[Rij].Naam;
     end
    else
    begin
    Edit3.Text := Edit3.Text;
    Edit2.Text := Edit2.Text;
    end;
    end;
end;

Dit is een voorbeeldje uit iets waar ik nu mee bezig ben, ik denk dat je zelf ff moet zoeken voor een duidelijker voorbeeld.

Ben namelijk nog niet zo lang bezig met Delphi ;).
Dan zal ik je maar meteen zeggen dat je die else weg kunt laten, er verandert daar namelijk niks: dus else begin ... end eruitslopen. 8-)

Verwijderd

Je kunt toch direct wel opvragen of het een fixed column is of niet? een of ander property....
En anders row[0].....

Daarnaast kun je het uiterlijk/kleur ed veranderen in
de OnColumnPaint oid event. Indien nodig kan ik morgen wel vb opsturen (op werk)
Pagina: 1