TStringGrid

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

TStringGrid

Beitrag von haderlump »

Hallo zusammen
Ich schreibe ja ein Programm zu Modelleisenbahnsteuerung.
Da habe ich eine Flächein vom Typ TImage, der die Gleiselemente, und damit der Gleisplan angezeit werden.
Die Fläche ist fiktiv in Zellen a 13 x 9 Pixel unterteilt. Jede dieser Zellen wird in einer Zeichenprozedur gefüllt, indem ich aus einem im Hintergrund geladenen Bild ein Rechteck mit der esagten Größe kopiere. Diese Prozedur ist notwendig, da die Auswahl der zu kopierenden Rechtecke bestimmten Kriterien folgen muß.
Das Heißt, das Aussehen passt sich diesen Kriterien an.
Das läft auch alles ganz prima.
Nun muß ich aber diese Zellflächen im weiteren Programm einzeln auswählen. Dazu werte ich die Mauskoordinaten aus, und aus eine Tabelle werden dann bestimmte Daten ausgelesen.

Nun, ich denke mit einem Grid-Objekt sollte das doch eleganter gehen.
Wie kann ich eine Zelle eines TDrawGrids mit Ausschnitten aus der Hintergrundzeichnung füllen ?

Alternativ:
Kann man ein Grid Transparent machen, d.H. Kann ich ein unsichtbares Grid über die TImage Komponente legen, so dass ich wenn ich scheinbar in die Zeichenfläche klicke, tatsächlich die Gridkoordinaten bekomme.

Gruß Fritz

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TStringGrid

Beitrag von mse »

haderlump hat geschrieben:Nun, ich denke mit einem Grid-Objekt sollte das doch eleganter gehen.
Wie kann ich eine Zelle eines TDrawGrids mit Ausschnitten aus der Hintergrundzeichnung füllen ?

Alternativ:
Kann man ein Grid Transparent machen, d.H. Kann ich ein unsichtbares Grid über die TImage Komponente legen, so dass ich wenn ich scheinbar in die Zeichenfläche klicke, tatsächlich die Gridkoordinaten bekomme.

Ich glaube nicht, dass sich die Kombination mit einer Gitterkomponente lohnt. Du machst ja keine Textdateneingaben in die Zellen.
Vermutlich fährst du besser wenn du eine eigene Komponente von TImage ableitest und die nötigen Prozeduren überschreibst.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TStringGrid

Beitrag von m.fuchs »

Hm, du schreibst von TDrawGrid im Betreff steht TStringGrid, aber egal. Ich hab mal schnell ein Beispiel gemacht:

Code: Alles auswählen

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
var
  c: TCanvas;
begin
  c := (Sender as TDrawGrid).Canvas;
  if (aRect.Left <= Image1.Width) and (aRect.Top <= Image1.Height) then
    c.CopyRect(aRect, Image1.Canvas, aRect);
end;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TStringGrid

Beitrag von m.fuchs »

Noch eine Idee, ist aber vermutlich ein größerer Umbau.

Die Gleiselemente sind doch sicherlich wiederkehrend. (grade Strecke, Linkskurve, Rechtskurve, Weiche, Prellbock, etc.). Dann könntest du jedes Element als kleines Einzelbild in Größe einer Tabellenzelle erstellen. Die packst du dann in eine ImageList und lädst bei jedem OnDrawCell das entsprechende Bild in die Zelle. DU musst dann natürlich irgendwo (in einem Array möglicherweise) festhalten, an welcher Postion welches Element liegt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: TStringGrid

Beitrag von haderlump »

Hallo m.fuchs
Die Überschrift ist natürlich Quatsch. Da hast du recht.

So nun zum Thema.

Ich kapier das noch nicht ganz.
was ist aState : TGridDrawState ? welchen wert muß ich da übergeben?

Dann die Zeile

Code: Alles auswählen

c := (Sender as TDrawGrid).Canvas;


Müßte da der Sender nicht das Bitmap sein. Oder brige ich da was völlig durcheinander.
Ich möchte ja die Zelle mit einem Bildchen füllen.

Noch zum letzten Post. Ich möchte schon das vorhandene Bitmap mit den Symbolen verwenden. Das ist schon fertig. Und ich müßte sonst 2048 kleine Bildchen neu erstellen, und das möchte ich mir schon lieber ersparen.

In meinem aktuellen Programm will ich da nichts mehr ändern, da das ja gut funktioniert.

Zum Hinergrund: Ich habe schon mehrere Tausend Stunden in das Programm investiert. und möchte das irgendwann als GNU Prgramm anderen Anwendern zur Verfügung stellen. Das Erstellen der Datendateien ist aber recht kompliziert wenn man das "Zu Fuß" macht, und es gibt sehr viele Möglichkeiten Fehler zu machen die man als normaler Anwender nur schwer finden würde. Deshalb möchte ich noch einen Gleisbildeditor schreiben, der diese Arbeit erledigt. Und genau hier ,denke ich, wäre das Drawgrid eine elegante Lösung.
Ich stelle mir das So vor:
Oben gbt es einen Symbolkatalog, (Drawgrid mit einer Reihe und 256 Spalten gefüllt mit den einzelnen Bildausschnitten aus der Bitmap. Drunter ist ein Gitter, das das spätere Gleisbild aufnehmen soll.
Der Anwender Zieht dann per Drag and Drop das Symbol in das Zielgitter. Der Anwender muß dann noch ein Formular mit den Eigenschaften ausfüllen, und schließlich sollen dann mit einem Buttonklick daraus die einzelnen Dateien (insgesammt 7 Stück) erstellt werden.

Wenn jemand an dem Projekt interessiert ist, kann er sich gerne beteiligen (Ich weiß allerdings nicht, wie das geht) :? .

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TStringGrid

Beitrag von mse »

haderlump hat geschrieben:Wenn jemand an dem Projekt interessiert ist, kann er sich gerne beteiligen (Ich weiß allerdings nicht, wie das geht) :? .

Ich kann schildern wie man auf Gitorious ein Projekt eröffnet und mit MSEgit damit arbeitet. git ist ein Software-Versions-Verwaltungssystem das zum Zweck der Zusammenarbeit mehrerer Programmierer entwickelt wurde. Bitte eröffne dafür ein neues Thema falls du daran interessiert bist.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TStringGrid

Beitrag von m.fuchs »

haderlump hat geschrieben:Ich kapier das noch nicht ganz.
was ist aState : TGridDrawState ? welchen wert muß ich da übergeben?


Du sollst da gar nichts übergeben, das ist Ereignisbehandlung. Leg dir ein DrawGrid auf dein Formular, geh in den Objektinspektor, Reiter Ereignisse und such in der Liste OnDrawCell. Dann klickst du in die rechte Zelle daneben, es erscheint ein Button mit drei Punkten, den klickst du an. Wie von Zauberhand legt Lazarus nun die Ereignisprozedur an. Du musst sie jetzt bloß noch mit Programmlogik füllen und die habe ich oben schon gepostet.

haderlump hat geschrieben:Dann die Zeile

Code: Alles auswählen

c := (Sender as TDrawGrid).Canvas;

Müßte da der Sender nicht das Bitmap sein. Oder brige ich da was völlig durcheinander.

Ja, bringst du. Sender ist immer die Komponente, die die Ereignismethode aufruft. Es ist ein Ereignis des Grids, also meldet sich auch das Grid.

haderlump hat geschrieben:Noch zum letzten Post. Ich möchte schon das vorhandene Bitmap mit den Symbolen verwenden. Das ist schon fertig. Und ich müßte sonst 2048 kleine Bildchen neu erstellen, und das möchte ich mir schon lieber ersparen.

Hm, du hast 2048 verschiedene Felder für den Plan? Das ist schon eine Menge.

haderlump hat geschrieben:In meinem aktuellen Programm will ich da nichts mehr ändern, da das ja gut funktioniert.
Zum Hinergrund: Ich habe schon mehrere Tausend Stunden in das Programm investiert.

Hmm, ich hätte bei deinen obigen Rückfragen jetzt ehrlich vermutet, dass du noch nie was mit Ereignisbehandlung gemacht hast. Stelle ich mir aber schwer vor bei so einem Programm.

haderlump hat geschrieben:Ich stelle mir das So vor:
Oben gbt es einen Symbolkatalog, (Drawgrid mit einer Reihe und 256 Spalten gefüllt mit den einzelnen Bildausschnitten aus der Bitmap. Drunter ist ein Gitter, das das spätere Gleisbild aufnehmen soll.
Der Anwender Zieht dann per Drag and Drop das Symbol in das Zielgitter.

Ok, das würde aus meiner Sicht noch stärker für eine Aufteilung des großen Bildes sprechen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: TStringGrid

Beitrag von haderlump »

Hallo Michael.
Ich hab das nun mal ausprobiert. Da gibt es ein Bild, und von dem wollte ich einen Ausschnitt in die Zelle Kopieren. Ich habe also den Code,den du mir gepostet hast, in die Ereignisprocedur kopiert. Wenn ich in das Gitter klicke rührt sich sofort was, es wird aber das komplette Bild in das Gitter kopiert, nicht nur der Ausschnitt. Kann es sein, dass sich das Canvas auf den Hintergrund des Gitters bezieht. Mann ist das kompliziert !

So, nun zu meinen Programmierkünsten.
Ich muß zugeben, dass ich mit Klassen etwas auf Kriegsfuß stehe. Natürlich habe ich rudimentäre Kenntnisse. Aber bis jetzt habe ich mich so durchgewurstelt.
Mein Modellbahnprogramm, mit dem ich mich hauptsächlich beschäftige Ist eine weitgehend klassenlose Gesellschaft.
Als ich vor rund 30 Jahren mit programmieren angefangen habe, war Basic, und Assembler angesagt. Dann kam noch C dazu.
Assembler und C prgrammiere ich heute noch im Bereich Microcontroller.
Ich habe es dann mit C++ probiert, und es machte mir keinen Spass. Es war ein reiner Kampf gegen die Compilermeldungen. Ich hatte noch kein Internet, und weit und breit keinen Bekannten der mir helfen konnte.
Spass hat es erst mit Delphi II gemacht. Und jetzt natürlich mit Lazarus.
Mein Modellbahnprogramm kommt mit relativ wenigen Aus-und Eingabeelementen aus. Die dazu erforderliche Klassenarbeitmacht die IDE für mich.
Der Hauptteil ist reine Logik, die im Verborgenen abläuft. Deshalb sind die meissten Procedueren ausserhalb von Klassen definiert. Es gibt eine zentrale Datenstruktur, auf die alle Proceduren zugreifen. Da ich Einzelkämpfer bin, gibt es auch keine Zugriffskonflikte.

So. Schluss jetzt mit dem Roman. Mit dem Gleisbildeditor willl ich mich nun auf das Parkett "Objektorientirtes Programmieren " wagen. Vielleicht kapiere ich das doch noch irgendwann. Dank eurer Hilfe, die ich unendlich schätze, könnte das was werden !
Gruß Fritz

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TStringGrid

Beitrag von m.fuchs »

haderlump hat geschrieben:Ich hab das nun mal ausprobiert. Da gibt es ein Bild, und von dem wollte ich einen Ausschnitt in die Zelle Kopieren. Ich habe also den Code,den du mir gepostet hast, in die Ereignisprocedur kopiert. Wenn ich in das Gitter klicke rührt sich sofort was, es wird aber das komplette Bild in das Gitter kopiert, nicht nur der Ausschnitt. Kann es sein, dass sich das Canvas auf den Hintergrund des Gitters bezieht. Mann ist das kompliziert!


Ja, das Canvas bezieht sich auf den Hintergrund, aber das ist nicht dein Problem. OnDrawCell ist ja die Ereignisbehandlung für das Zeichnen einer Zelle. Aber wann das durchgeführt wird, entscheidet das Grid. Und zwar danach, ob diese Zelle gerade sichtbar ist oder nicht. Wenn du jetzt eine Zelle hast, in der nicht vom Bild kopiert werden soll, musst du diese Logik in das OnDrawCell einbauen. Das heißt auch, du musst irgendwo zwischenspeichern, ob der Zellinhalt sichtbar sein soll oder nicht.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: TStringGrid

Beitrag von haderlump »

Danke mal fürs Erste.

Gruß Fritz

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TStringGrid

Beitrag von m.fuchs »

Ich habe mal ein Beispiel zusammengebastelt, das zeigt wie man auf einfache Weise solche Zellinformationen im Speicher ablegen kann. Und wie darauf am besten im OnDrawCell reagiert wird.
Die Bilder für die Zellen liegen, wie vorgeschlagen, in einer Imagelist vor. Vielleicht hilft dir das ja irgendwie.

http://www.michael-fuchs.net/newsgroups/lazarusforum.de/drawgrid_tracks_example.zip
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: TStringGrid

Beitrag von haderlump »

Danke, Ich habs mir heruntergeladen, und were es mir mal anschauen, im Moment habe ich allerdings keine Zeit (Rentnerstress !!!)

Antworten