Autor |
Beitrag |
HeelX
Hält's aus hier
Beiträge: 10
WinXP Home
|
Verfasst: Do 11.05.06 17:27
Hallo,
habe mich durchs Forum gewühlt bezüglich Fonts festlegen für einzelne Zellen eines Stringgrids und so.. aber ich habe folgendes Problem:
in meinem OnDrawCell Event soll der String der Zelle in der 2ten Spalte, die berührt wird, fett dargestellt werden, ansonsten normal:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TticketOverview.ticketListingDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var mcol, mrow: integer; begin
if (acol = 1) then begin ticketlisting.MouseToCell(mouse.CursorPos.x, mouse.CursorPos.y, mCol, mRow);
label1.caption := inttostr(mcol) + '/' + inttostr(mrow);
if (mcol = acol) and (mrow = arow) then begin with (Sender as TStringGrid) do begin Canvas.Font.Style := Canvas.Font.Style + [fsBold]; Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[mCol, mRow]); end; end; end; end; |
damit der Event immer ausgelöst wird, wenn der Mauszeiger die Komponente berührt, führe ich immer folgendes aus:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TticketOverview.ticketListingMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin ticketListing.repaint; end; |
Ich finde keinen Fehler, schließlich erzwinge ich ja quasi durch repaint dass im drawcell event immer die aktuelle Mausposition erkannt wird...
komisch...
mfG
Christian
Moderiert von raziel: Code- durch Delphi-Tags ersetzt
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Do 11.05.06 19:46
Hallo
in deinem Post fehlt irgendwie die Fehlerbeschreibung. Mir fehlt in deinem Code, das du zwar den fontstyle setzt, aber ihn nie wieder zurücksetzt. Du wirst wahrscheinlich aber überhaupt nichts sehen, da dein mousetocell höchstwahrscheinlich nicht funktioniert. Du übergibst die Screen-Mouse-kooridnaten, mousetocell erwartet die mouse-koordinaten innerhalb des Grids. da fehlt ein screentoclient.
Delphi-Quelltext 1: 2: 3: 4:
| Var p:Tpoint; ... p:=StringGrid1.ScreenToClient(mouse.CursorPos); StringGrid1.MouseToCell(p.x,p.y, mCol, mRow); |
ich persönlich würds anders lösen und nicht beim ondraw mousetocell aufrufen und auch nicht jedesmal das komplette Grid neuzeichnen. Wenn Du pech und einen langsameren Rechner hast, kann es durchaus sein, das du das neuzeichnen siehst oder es zu leicht spürbaren Verzögerungen kommt.
in etwa so, nicht groß weiter probiert:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| type TGridhack=class(TStringGrid);
TForm1 = class(TForm) ... private FMouseCol,FMouseRow:integer; ...
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer); Var Acol,aRow:integer; begin with sender as TStringGrid do begin MouseToCell(x,y,Acol,Arow); if (Acol<>FMouseCol) or (aRow<>FMouseRow) then begin TGridhack(Sender).InvalidateCell(FMouseCol,FMouseRow); FMouseCol:=acol; FMouseRow:=arow; TGridhack(Sender).InvalidateCell(FMouseCol,FMouseRow); end; end; end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;Rect: TRect; State: TGridDrawState); begin with Sender as TStringGrid do begin If (Acol=1) and (Acol=FMouseCol) and (ARow=FMouseRow) then canvas.Font.Style:=[fsbold] else canvas.Font.Style:=[];
canvas.FillRect(rect); canvas.TextOut(rect.Left+2,rect.Top+2,Cells[acol,arow]); end; end; |
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
HeelX 
Hält's aus hier
Beiträge: 10
WinXP Home
|
Verfasst: Do 11.05.06 20:16
Ja, gut, ich hätte vielleicht schreiben sollen dass der beabsichtigte Effekt nicht auftritt, da haben Sie recht.
Also.. erst einmal vielen Dank für den Tipp. Diese "Schlieren" beim kompletten repaint sind mir auch aufgefallen und die Idee vom partiellen neuzeichnen ging mir auch durch den Kopf..
Aber da stellen sich bei mir noch ein paar Fragen: Sie müssen sie nicht beantworten, eine URL zu der Beschreibung oder so würde mir auch weiterhelfen:
1. TStringgrid wird ja von TCustomGrid abgeleitet.. aber wieso habe ich in TStringgrid nur die invalidate Methode und nicht direkt Zugriff auf die InvalidateCell Methode, wenn es doch von TCustomgrid abgeleitet ist? Deshalb wird wahrscheinlich bei Ihnen der Umweg auch mit folgendem gemacht:...
2. TGridhack=class(TStringGrid); --- warum wird denn nochmal eine Instanz eines Stringgrids erzeugt? und wieso rufe ich die InvalidateCell Methode darüber auf?
Ich wollte jetzt nicht nur nen C&P machen, sondern auch verstehen wieso das nicht direkt über mein Stringgrid Objekt direkt geht.
Vielen Dank!
mfG
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Do 11.05.06 21:21
Hier im Forum sagt man Du
1. invalidateCell, -col, -row sind alle nur protected und somit nur in abgeleiteten Klasse direkt sichtbar.
2. Tgridhack(Stringgrid) ist nur ein Typecast und nein, es wird keine neue Instanz erzeugt. Du leitest Tgridhack nur vom Tstringgrid ab. Tcustomgrid(Sender) geht nicht, da so nicht auf die protected Methoden zugegriffen werden kann.
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
HeelX 
Hält's aus hier
Beiträge: 10
WinXP Home
|
Verfasst: Fr 12.05.06 11:17
Dank dir
Ja.. gut.. aber weder steht in der Hilfe unter InvalidateCell (TCustomGrid) noch unter Invalidate (TStringGrid), das ersteres nicht direkt verfügbar (protected) ist? Oder ist das allgemein so?
Im Grunde ist meine Ursprungsfrage geklärt, also hake ich den Thread mal ab.
mfG
Christian
_________________ // we hate fun
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Fr 12.05.06 17:45
welche Delphiversion verwendest du?
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
HeelX 
Hält's aus hier
Beiträge: 10
WinXP Home
|
Verfasst: Fr 12.05.06 18:18
Zur Zeit übe und experimentiere ich mit Delphi 6 von einem Arbeitskollegen, um überhaupt das Ganze mal kennenzulernen. Hat mir gut gefallen soweit, ich hab mir gestern die Version "Delphi 2005 Personal Edition" nachbestellt (war als .ISO auf der Heft-DVD einer Ausgabe der CT' beigelegt, kostenlos registrierbar und wenn man eine einzelne Person ist, auch kommerziell nutzbar, stand in der Beschreibung) So wie ich das verstanden habe, sind Delphi 6 Projekte portierbar nach 2005 und 2005 wäre besser als Delphi 6 O.o?? Ich hoffe mal das man mich jetzt nicht übers Ohr gehauen hat!!
mfG
Christian
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Fr 12.05.06 18:22
in der D6 hilfe hast du bei den Komponenteneigenschaften/methoden ein grünes oder gelbes kästchen davor, daran siehst du die sichtbarkeit (wird in der legende erklärt)
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
HeelX 
Hält's aus hier
Beiträge: 10
WinXP Home
|
Verfasst: Fr 12.05.06 22:59
Aha, das ist nicht schlecht! Also das mit dem typecasts hat ja wohl was mit OOP zutun.. Also kann ich immer auf diese "protected" Eigenschaften zugreifen, wenn ich nen Typecast der entsprechenden parent-klasse erstelle? Ich hatte noch nie soviel zutun mit OOP, ist alles ein wenig schwierig für mich.
Danke!
|
|
|