TStringGrid (gelöst)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

TStringGrid (gelöst)

Beitrag von Bauer321 »

Moin,

ich würde gerne mit dem StringGrid Arbeiten komme jedoch nicht richtig voran. Zum einen finde ich schonmal keine Option die Spaltenbreite für jede Spalte festzulegen(am besten wäre es wenn zudem der Benutzer mit einem Klick im header diese selber setzen könnte) zum anderen Weiß ich nicht so richtig welches Event ich nutzen soll wenn ich bei einem Zeilenwechsel etwas machen möchte. Also sobald der Benutzer eine neue Zeile auswählt soll etwas gemacht werden.
Zuletzt geändert von Bauer321 am So 11. Sep 2011, 13:53, insgesamt 1-mal geändert.
www.mcpatcher.net | www.hoeper.me

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: TStringGrid

Beitrag von Scotty »

Du suchst nach ColWidth[<Spalte>], Options+[goColSizing], OnCellSelect() und insbesondere http://wiki.lazarus.freepascal.org/Grids_Reference_Page" onclick="window.open(this.href);return false;.

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: TStringGrid

Beitrag von Bauer321 »

ok vielen dank ich werd das ma alles austesten. Das ich das richtige event nicht gefunden hab hat damit zu tun das ich tests mit showmessage gemacht habe wodurch irgendwie fehler entstanden sind also das program hat irgendwie nicht erkannt das der klick zu ende ist und dann alle anderen spalten mit ausgewählt wodurch ich mit messages überflutet wurde. Hab danach mit einem Memo getestet und bin zu dem ergebnis gekommen das OnBeforeSelection das richtige event für mein vorhaben ist ;)

edit:
bei folgendem code:

Code: Alles auswählen

//SGVersions ist ein TSringGrid
SGVersions.ColWidth[0] := 150; //Zeile 51
bekomme ich diese Meldung:

Code: Alles auswählen

uaddver.pas(51,14) Error: identifier idents no member "ColWidth"
edit2:
Fehler gefunden
so ists richtig:

Code: Alles auswählen

SGVersions.ColWidths[0] := 150; //Widths mit s
www.mcpatcher.net | www.hoeper.me

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: TStringGrid

Beitrag von Bauer321 »

wie kann ich die momentan ausgewählte Zeile löschen? Also nicht nur das Feld sondern die Ganze Zeile soll weg sein.
Oder muss ich dazu allen Einträge danach eine Spalte nach oben verlegen und dann die unterste löschen?
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: TStringGrid

Beitrag von MAC »

Code: Alles auswählen

TStringGrid.DeletRow(TStringGrid.Row);
das sollte alles machen.
Wenn du mehrere Einträge löschen willst nim BeginUpdate und EndUpdate um redudanten Code nicht mehrmals auszuführen ...

Code: Alles auswählen

Signatur := nil;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: TStringGrid

Beitrag von Bauer321 »

Danke bin zar nicht mehr am pc werds morgen aber sofort ma testen.
Das mit dem begin und end update nutze ich bereit ;) auch wenn ich das nicht erklären kann weiß ich das das programm dadurch flüssiger wird (ich weiß noch wie ich früher in nen memo 1000 einträge gemacht habe ohne begin und endupdate ... da hieß es warten mit begin und endupdate wars gar kein problem mehr. Ob man einen oder 1000 einträge macht merkt man dann nicht mal mehr)
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: TStringGrid

Beitrag von MAC »

Das ist ganz einfach zu erklären:

Hier ein beispiel mit einer Listbox (gleiches Prinzip)

Code: Alles auswählen

Listbox1.Clear;
Listbox1.Add('Test1');
Listbox1.Add('Test2');
Listbox1.Wdith := 100;
Wenn man das jetzt ausführt passiert folgendes:
1.Zeile:
alles wird gelscöht.
Box wird neu gezichnet.
2.Eintrag
--> Box und ein Eintrag wird gezeichnet.
3.Eintrag
--> Box und 2 Einträge werden gezeichnet.
4. Width geändert
--> Box und 2 Einträge werden gezeichnet.

Das ganze passiert in 10 ms.
Und eigentlich will der Programmierer garnicht das in zeile 1-3 Gezeichnet wird (denn zeichnen ist langsam (deswegen haben viele ne 200 € graka ^^ und auf der CPU zu zeichnen ist noch schlimmer..))

Deswegen das BeginUpdate und EndUpdate;
Es wird zwar etwas geändert, aber das Objekt zeichnent nicht neu. Es wartet mit dem Zeichen auf das EndUpdate ...
Und in deinem Beispiel mit 1000 Einträgen würde das Bedeuten :
1000 mal wird die Box gezeichnet
und es werden 1+2+3+4+5+6+7..+998+999+1000 Einträge gezeichnet = 501000 !!! und im vergleich dazu sind 1000 nichts ...
Zuletzt geändert von MAC am So 11. Sep 2011, 14:44, insgesamt 1-mal geändert.

Code: Alles auswählen

Signatur := nil;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: TStringGrid

Beitrag von Bauer321 »

ja so in etwa hab ich mir das schon gedacht ;) danke nochmal für die erklärung. war sehr leicht zu verstehen
www.mcpatcher.net | www.hoeper.me

Antworten