Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringGrid komplett selbst steuern (https://www.delphipraxis.net/117357-stringgrid-komplett-selbst-steuern.html)

Coder1990 16. Jul 2008 14:57


StringGrid komplett selbst steuern
 
Seas,

ich arbeite gerade an einem ID3Tag-Modifizier Programm und lasse mir Titel,Artist,Album (usw.) in ein TStringGrid eintragen.
Zur Umsetzung einiger Funktionen muss man im StringGrid die Zellen markieren können wie man will..
Was will ich damit sagen?
- Man soll z.b. in Col[0] Row[1],Row[3] und Row[5] markiert haben können, während in Col[4] wiederum andere Rows markiert sind
Und da ein TStringGrid nur Rechteckige Markierungsbereiche zulässt hab ich mich entschlossen nun das markieren selbst vorzunehmen.
Folgende Fragen haben sich dazu ergeben:
1. Wie kann ich den grauen Kasten entfernen den man automatisch als Markierung mitschleppt
2. Wie kann das Scrollen selbststeuern? (Scrollby verschmiert nur das Canvas und mit Refresh lande ich irgendwie wieder oben)
Mein Ansatz für 2:
Delphi-Quellcode:
procedure TFMain.SGMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
Handled:=true;
Draw.Enabled:=true; // Dieser Timer zeichnet die Markierung (kommt später noch)
SG.ScrollBy(0,-10);
{SG.refresh}
end;
3. Warum werden die Cells bei dieser Procedure nicht ausgemalt, obwohl der text gezeichnet wird?: (gelöst)
Delphi-Quellcode:
procedure TFMain.DrawTimer(Sender: TObject); // Das hier ist der Timer der die Markierung zeichnet
var
i,k:integer;
r:trect; b:string;
begin
SG.Refresh;
Draw.Enabled:=false;
SG.Brush.Color:=clHighlight;
for i:=0 to 5 do
  for k:=1 to SG.RowCount-1 do
      if SG_Sel[i,k] then
        begin
          r:=SG.CellRect(i,k);
          b:=SG.Cells[i,k];
          {SG.canvas.FillRect(r);} // <- dieser befehl war vorher (ging nicht)
          SG.Canvas.Rectangle(r); // <- hat das prob gelöst - also geht nun
          DrawText(SG.Canvas.Handle,PChar(b), length(b), r,DT_Center or DT_WordBreak);
        end;
end;
4. Wie kann ich Mausklicks auf das StringGrid abfangen ohne dass das TStringGrid darauf selbsttändig reagieren kann?
5. Hat jemand effizientere Vorschläge für die oben geposten Delphi Codes?

MfG

//edit:
6. Kann mir vll jemand die Grids.pas geben, weil ich hab Delphi 2005 und finde die im ordner nicht^^.
Möglicherweiße könnte ich nähmlich einfach das Tstringgrid ableiten und die click bzw. select proceduren mit "begin end" overriden.

toms 16. Jul 2008 17:13

Re: StringGrid komplett selbst steuern
 
Zitat:

Zitat von Coder1990
6. Kann mir vll jemand die Grids.pas geben, weil ich hab Delphi 2005 und finde die im ordner nicht^^.
Möglicherweiße könnte ich nähmlich einfach das Tstringgrid ableiten und die click bzw. select proceduren mit "begin end" overriden.

Hallo,

zu 6: Den Quelltext einer Komponente brauchst du nicht, wenn du sie ableiten möchtest.

Coder1990 16. Jul 2008 18:27

Re: StringGrid komplett selbst steuern
 
ich habe nie geschrieben, dass ich die unit zum ableiten benötigen würde ;)
ich wollte bloß die privaten procedures bzw. funktionen erfahren (deren namen) damit ich diese auch overriden kann :D

Hansa 16. Jul 2008 20:02

Re: StringGrid komplett selbst steuern
 
Dann gebe so was ein : StringGrid1. Der Punkt dürfte das gesuchte liefern. Aber richtig eingeben. :mrgreen:

Coder1990 16. Jul 2008 20:13

Re: StringGrid komplett selbst steuern
 
also irgendwie zeigt der bei mir beim "." setzen nur die in PUBLIC eingetragenen functions, procedures usw.
aber wie ich vll schon gesagt habe will ich die PRIVATE procedures modifizieren
(schätze mal nicht dass die internen funktionen zum "graue box" erstellen oder so public sind -.-)

// btw könnte sich jemand auch mal die anderen fragen anschauen :zwinker:

Hansa 16. Jul 2008 20:41

Re: StringGrid komplett selbst steuern
 
Zitat:

Zitat von Coder1990
aber wie ich vll schon gesagt habe will ich die PRIVATE procedures modifizieren
(schätze mal nicht dass die internen funktionen zum "graue box" erstellen oder so public sind -.-)
...
ich habe nie geschrieben, dass ich die unit zum ableiten benötigen würde ;)
ich wollte bloß die privaten procedures bzw. funktionen erfahren (deren namen) damit ich diese auch overriden kann :D

Warum heißt das wohl "private" ? Warum heißt es ableiten, überschreiben etc. und nicht "modifizieren" ? Das ist OOP und da benutzt man Vererbung, inherited etc. Und das private ist genau dazu da, das eben nicht durchgängig möglich zu machen.

gut, zu 3. noch : wo ist denn das FillRect ? :zwinker: Ich sehe da nur, dass ein Text mit Drawtext angezeigt werden soll und die Zelle ansonsten so bleibt wie sie ist. Das ist zumindest kein Delphi-Bug. :mrgreen:

P.S.: du tust dir selber keinen Gefallen damit, 5 Fragen in eine zu packen.

Coder1990 16. Jul 2008 20:55

Re: StringGrid komplett selbst steuern
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von Coder1990
aber wie ich vll schon gesagt habe will ich die PRIVATE procedures modifizieren
(schätze mal nicht dass die internen funktionen zum "graue box" erstellen oder so public sind -.-)
...
ich habe nie geschrieben, dass ich die unit zum ableiten benötigen würde ;)
ich wollte bloß die privaten procedures bzw. funktionen erfahren (deren namen) damit ich diese auch overriden kann :D

Warum heißt das wohl "private" ? Warum heißt es ableiten, überschreiben etc. und nicht "modifizieren" ? Das ist OOP und da benutzt man Vererbung, inherited etc. Und das private ist genau dazu da, das eben nicht durchgängig möglich zu machen.

oben wurde gesagt ich soll mit stringgrid1. durchgucken soll - da werden mir nunmal nur die in public deklarierten angezeigt
(oder habt ihr gemeint dass ich in meiner neuen unit mit der ableitung irgendwie durchgucken soll? -> wenn ja weiß ich nicht genau wo ich dies tun soll damit ich privates angezeigt krieg). Versteht denn keiner was ich meine?

Zitat:

Zitat von Hansa
gut, zu 3. noch : wo ist denn das FillRect ? :zwinker: Ich sehe da nur, dass ein Text mit Drawtext angezeigt werden soll und die Zelle ansonsten so bleibt wie sie ist. Das ist zumindest kein Delphi-Bug. :mrgreen:

punkt 3 ist schon gelöst ;) hab doch ein "// hat das prob gelöst" drangemacht ;);)

Zitat:

Zitat von Hansa
P.S.: du tust dir selber keinen Gefallen damit, 5 Fragen in eine zu packen.

hmm sind halt alle zum thema stringgrid und ich hab mir halt gedacht da kommt so ein ub3r 1337 pr0 der mir alle löst :P

mach ich nächstes mal halt 6 threads auf xD (achtung ironie^^)

MfG

Diamondback2007 16. Jul 2008 21:06

Re: StringGrid komplett selbst steuern
 
Das Problem das du hast ist folgendes.
Wenn eine Methode beim Stringgrid nicht als
Delphi-Quellcode:
virtual
markiert ist kannst du es auch nicht überschreiben...

Coder1990 16. Jul 2008 21:19

Re: StringGrid komplett selbst steuern
 
sowas in der art hab ich mir auch schon gedacht ...
hat jemand ne idee, wie ich das machen kann?

Diamondback2007 16. Jul 2008 21:58

Re: StringGrid komplett selbst steuern
 
evtl ein anderes Freewaregrid benutzen, da kannst du dann auch am Code rumbasteln. Guck doch einfach mal auf Torry.

Coder1990 16. Jul 2008 22:12

Re: StringGrid komplett selbst steuern
 
ehrlich gesagt hab ich soll das halt ein privat projekt werden wie auch ein übungsprojekt und da schreib ich am liebesten immer alles selbst...
noch alternativen?

Hansa 16. Jul 2008 22:50

Re: StringGrid komplett selbst steuern
 
Zitat:

Zitat von Coder1990
..oben wurde gesagt ich soll mit stringgrid1. durchgucken soll - da werden mir nunmal nur die in public deklarierten angezeigt..

Das nennt sich auch nicht umsonst "kontextsensitive Hilfe" oder Codevervollständigung. Das steht im Kontext, zu dem was gewünscht wird und zumindest mal theoretisch machbar ist. Soll der bei jedem engegebenem "b" jetzt anzeigen, dass es möglich wäre "begin" zu verwenden oder wie ? Erscheint da nichts, dann geht das eben nicht und du bist auf dem falschen Dampfer. :P

Zitat:

Zitat von Coder1990
punkt 3 ist schon gelöst ;) hab doch ein "// hat das prob gelöst" drangemacht ;);)

Du hast aber den Quelltext modifiziert und das nicht gesagt. In 1 Woche weißt du das selber nicht mehr und der Thread wird wertlos. Vorher war das FillRect zumindest auskommentiert, wenn überhaupt vorhanden. 8)

Zitat:

Zitat von Coder1990
mach ich nächstes mal halt 6 threads auf xD (achtung ironie^^)

Die kann man ja eventuell auch in 2-3 zusammenfassen. 6 Fragen auf einmal sind zuviel, im Zweifelsfall eben 6 Themen. Punkt 3 ist gelöst. 5 sind offen und glaube nur nicht, dass ich mir die nochmals durchlese. Da ist kaum ein Zusammenhang zu sehen. Hier sind einige, die kommen sich langsam verarscht vor. Mit Ironie wirst du also weit kommen. :mrgreen:

Coder1990 16. Jul 2008 23:26

Re: StringGrid komplett selbst steuern
 
hab mal punkt 3 als gelöst markiert ;)

ich habe angenommen dass die procedures die für das selecten verantwortlich sind, nur im private bereich zu finden sind..
bei der kontexthilfe von stringgrid1. werden aber nur public deklarationen angezeigt, was mich ja in der hinsicht nicht weiterbringt.. naja das thema mit private public kann man ja scheinbar eh vergessen da man sie ja nicht overriden kann...

wobei ich das schonmal versucht hab bei irgendeiner "Click()" procedure von tstringgrid und da hats eigentlich geklappt?! ..

Hansa 16. Jul 2008 23:39

Re: StringGrid komplett selbst steuern
 
Zitat:

Zitat von Coder1990
...ich habe angenommen dass die..

Nützt dich aber nichts. Hätte, wenn und aber.... Ich sehe gerade, dass du D6 Pro verwendest. :shock: Also sind die VCL-Quelltexte vorhanden und Basta. :mrgreen:

Coder1990 17. Jul 2008 00:00

Re: StringGrid komplett selbst steuern
 
öh? hatte eigentlich das delphi 2005 eingestellt (delphi 6 personal (!)) hab ich auch, aber kein professial..
sry muss mich verklickt haben -.-

MfG

btw hab ich die quelltexte nicht oder sind die bei 2005 irgendwo dabei? ^^

//edit ich versuche gerade eine transparente bitmap über mein stringgrid zu legen.. vll kann ich dann damit die clicks abfangen
//edit2 hmm ein timage kann ja gar nicht über einer komponente liegen ~~
Ich spezifier mal die Fragestellung, dies ist eigentlich mein Hauptanliegen:
Wie kann ich Clicks die auf ein TStringGrid getätigt werden SELBST verarbeiten, ohne dass das TStringGrid von diesen Clicks "erfährt"?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz