Stringgrid: Spalten- und Gridbreite bestimmter cols anpassen

Für Fragen von Einsteigern und Programmieranfängern...
cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Stringgrid: Spalten- und Gridbreite bestimmter cols anpassen

Beitrag von cletep »

Hallo,

ich bin's schon wieder. Bin gerade dabei das Aussehen meiner Formulare zu überarbeiten und da wollte ich jede dritte Spalte des Stringgrids doppelt so groß machen, wie die beiden darauffolgenden, da in diesen nur eine oder zwei Ziffern stehen, aber in der anderen eine Bezeichnung. Da das Stringgrid regelmäßig bleiben soll, will ich nicht jede Spalte auf den jeweiligen längsten Eintrag anpassen. Folgende Funktion habe ich benutzt:

Code: Alles auswählen

 
for i:=0 to 5 do 
Stringgrid1.ColWidths[3*i] := 140;
Das ganze wird im FormShow Ereignis durchgeführt und Options goColSizing ist auf true gestellt. Dennoch bleiben die Zellbreiten wie sie sind. Man kann sie auch nicht in der aktiven Anwendung mit der Maus ändern, obwohl man eine Verschiebesymbol angezeigt bekommt. Weiß jemand woran das liegen könnte?

Meine zweite Frage lautet, ist es möglich, dass jede 3. vertikale Gridlinie fetter ist als die anderen, um so die jeweils drei zusammengehörigen Spalten visuell hervorzuheben?

Vielen Dank schon mal im Voraus.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1627
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von corpsman »

Du kannst die Zellen selbst malen lassen, dann kannst du die Gridlinie auch fetter malen.
siehe dazu

Code: Alles auswählen

 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
 
end;
 
 
Attribut DefaultDrawing := false;
--
Just try it

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von cletep »

Ich dachte es gäbe evtl eine einfachere Lösung, denn nur für die breiteren Linien will ich mir nicht die Arbeit machen das ganze Stringgrid Zelle für Zelle selber zu zeichnen.

Wichtiger ist mir da, ob es eine einfache Lösung gibt die Spaltenbreite individuell anzupassen bzw. woran es liegen könnte, dass es bei mir mit dem Befehl nicht geht. Notfalls muss ich die Spalten halt per Maus möglichst gleich groß ziehen, obwohl ich es schon lieber exakt hätte.

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von cletep »

Mein Fehler war, dass ich AutoFillColumns auf True gesetzt hatte. Allerdings kann der Benutzer das Stinggrid ja selbst auch verändern, wenn ich das über diese Befehle mache, da GoColSizing auf True stehen muss.

Also habe ich mein Stringgrid einfach per Maus so gezogen, wie ich es haben will. Dann tritt bei mir aber immer irgendein Lazarus-Bug auf nämlich, dass um das Stringgrid ein schwarzer Balken geht und wenn man in die Letzte Zeile des Stringgrids klickt, die erste Zeile gelöscht wird. Ziemlich seltsam. Kennt jemand das Problem und weiß wie man es beheben kann?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von Michl »

Kannst du das Problem in einem Minimalbsp. posten?!

Ich habe versucht das nachzubauen - ohne Erfolg! D.h. bei mir ist das erfolgreich :) -> Ich kann ohne Probleme eine Stringgrid erstellen, in div. Events die Breite der Cols mit StringGrid1.ColWidths ordentlich definieren. Wenn ich Option goColSizing auf true stelle, kann man zur Laufzeit ohne Probleme die Breite der Spalten mit der Maus verändern! Lazarus/FPC/System siehe Profil.
cletep hat geschrieben:um so die jeweils drei zusammengehörigen Spalten visuell hervorzuheben?
Du könntest auch eine extrem kleine Spalte neben den drei Spalten erstellen, die als optische Trennung dient... ist nicht unbedingt die beste/bzw. sauberste Lösung, würdest dir aber das Selbstzeichnen sparen (wobei das eigentlich auch kein Problem darstellt, gibts genügend Lösungen im Netz). Du musst dann allerdings beim Füllen der Stringgrid auf die Spaltennummerierung achten!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von Soner »

1.
Das hier scheint falsch zu sein:
for i:=0 to 5 do
Stringgrid1.ColWidths[3*i] := 140; //Hast du den 9,12,15 oder mehr Spalten ?

Benutze lieber while Schleife:

Code: Alles auswählen

 
i:=0;
while i<StringGrid1.ColCount do begin
  Stringgrid1.ColWidths[i] := 140;
  Inc(i,3);
end;
 
2.
Wenn die Option goColSizing True ist dann kann man auf jeden Fall die Spaltenbreite mit der Maus verändern (nur über Titelzeile). Du musst irgendetwas falsch machen. Hast du vielleicht von Stringgrid Enabled-Eigenschaft auf False gesetzt?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von Michl »

Soner hat geschrieben:Das hier scheint falsch zu sein:
for i:=0 to 5 do
Stringgrid1.ColWidths[3*i] := 140; //Hast du den 9,12,15 oder mehr Spalten ?
Das sollte passen, sonst gibts ne Exception mit List out of bounds...
Michl hat geschrieben:2.
Wenn die Option goColSizing True ist dann kann man auf jeden Fall die Spaltenbreite mit der Maus verändern (nur über Titelzeile). Du musst irgendetwas falsch machen. Hast du vielleicht von Stringgrid Enabled-Eigenschaft auf False gesetzt?
hatte er schon selbst gelöst:
cletep hat geschrieben:Mein Fehler war, dass ich AutoFillColumns auf True gesetzt hatte.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von cletep »

Michl hat recht, über die Befehle hat es jetzt funktioniert, aber ich will nicht das der Nutzer das Stinggrid verändern kann. Also habe ich es mit der Maus editiert. Wenn ich das Programm nun aber starte, hat mein Formular diesen schwarzen Balken um das Stringgrid (siehe Bild) und es löscht die erste Spalte oder Zeile, wenn man in die Letzte Spalte bzw. Zeile klickt.
Stringgrid_Bug1.png
Habe es gerade noch mal getestet. Der Balken zusammen mit dem Fehler tritt auch auf, wenn ich nur ein Stringgrid in ein Formular ziehe und dort ein Spalte per Mauszeiger vergrößere.
Zuletzt geändert von cletep am So 25. Aug 2013, 16:44, insgesamt 1-mal geändert.

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von cletep »

Nach dem Klicken in die unterste Zeile sieht es so aus:
Stringgrid_Bug2.png

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von cletep »

Hier die Bilder vom Test. Mir ist aufgefallen, dass wenn ich in die Zelle unten rechts klicke sogar die erste Zeile und die erste Spalte verschwinden:
test2.png
Hat irgendjemand eine Ahnung, wie man das Problem beheben kann und tritt es bei euch auch auf?

Bin für jede Hilfe dankbar.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von Michl »

Kannst du das Minimal-Projekt mal als Zip posten?! Ich gebe mir alle erdenkliche Mühe, bekomme dein Problem nicht erstellt!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von cletep »

Habe mich zwischendurch mit etwas anderem beschäftigt. Hier hast du das project:
Dateianhänge
Lazarus bug.zip
(126.32 KiB) 69-mal heruntergeladen

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von Michl »

Ok, bei mir das Gleiche...

Ist ein Problem mit den Scrollbars im Designmodus, der sich dann auf das Projekt zur Laufzeit überträgt (Stellt man Scrollbars von ssAutoBoth auf ssNone - kein Problem). Die Zeilen bzw. Zellen verschwinden auch nicht, so scrollen beim Klick nur nach oben bzw. links. Gehst du in eine Zelle und mit den Pfeiltasten nach oben bzw. links sind sie wieder da!

Erstelle ich die Stringgrid, funktioniert das. Müsste ein Bug sein und ist bei meiner Lazarus-Version behoben, da ich das Problem nur habe, wenn ich dein Projekt öffne. Sobald ich die Größe veränder, ist bei mir die Stringgrid (mit den Scrollbars) wieder ordentlich. Welche Lazarus-Version nutzt du?!

Du könntest auch versuchen, deine Stringgrid so zu erstellen, dass die Scrollbars auch ordentlich zur Designzeit angezeigt werden.

[Edit] habe es neben Lazarus 1.1 eben bei 1.0.10 probiert, geht auch problemlos...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von cletep »

vielen dank, michl. Endlich kann ich die Spalten anpassen ohne, dass ich diesen nervigen Bug bekomme. Habe Version 1.0.10 und nachdem ich ssnone bei scrollbars eingestellt habe, funktioniert's wunderbar.

Jetzt musst du mir nur noch verraten, ob es geht, dass jede 3. Spalte den Inhalt mittig anordnet und wie man die Zeilen größer ziehen kann (da erscheint bei mir nicht das Verschiebe-Symbol), dann wäre mein Formular genau, wie ich es mir vorgestellt habe ;)

Achso, und gibt es eine Möglichkeit, im FormClose Ereignis dieses ab zubrechen, ohne dass die Form dann schließt? wäre bei meinem "Sie haben ungespeicherte Inhalte Dialog" von Vorteil. ;)

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Stringgrid: Spalten- und Gridbreite bestimmter cols anpa

Beitrag von Michl »

cletep hat geschrieben:dass jede 3. Spalte den Inhalt mittig anordnet
IMHO geht das nur mit Selberzeichnen, siehe oben
cletep hat geschrieben:die Zeilen größer ziehen kann
Zur Laufzeit per Maus, muss dann wie gehabt Option goColSizing auf True stehen. Oder du definierst sie fix, z.B. beim Starten (Form.OnCreate) allen Zellen die von dir gewünschte Größe zuweisen.
cletep hat geschrieben:Achso, und gibt es eine Möglichkeit, im FormClose Ereignis dieses ab zubrechen, ohne dass die Form dann schließt? wäre bei meinem "Sie haben ungespeicherte Inhalte Dialog" von Vorteil.
z.B.

Code: Alles auswählen

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
//    CloseAction:=caNone; //Wäre nur der Abbruch des Schließens
 
  if not saved then
    if application.MessageBox(pchar('Soll die Stringgrid noch gespeichert werden?!'),'Speichern (J/N)',4)=6
      then Stringgrid1.SaveToFile(Dateiname);
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten