Überschriebene Prozedure wird nicht aufgerufen

Für Fragen von Einsteigern und Programmieranfängern...

Überschriebene Prozedure wird nicht aufgerufen

Beitragvon AlterMann » 12. Feb 2017, 13:36 Überschriebene Prozedure wird nicht aufgerufen

Hallo

Ich seh' den Wald schon wieder vor lauter Bäumen nicht.

Ich habe eine Form mit zwei StringGrids.

Bei einem davon möchte ich die Schrift in der ersten Zeile um 90° drehen.

Mach ich es so:
Code: Alles auswählen
 
type
  TStringGrid = class(Grids.TStringGrid)
  protected
    procedure DrawCellText(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState; AText: String); override;
  end;
 
 
implementation
 
procedure TStringGrid.DrawCellText(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState; AText: String);
 
  var TextPosition: TPoint;
 
 begin
     if aRow = 0 then
     begin
      Canvas.Font.Orientation := 900;
      TextPosition.X := ARect.Left +
        ((ARect.Right - ARect.Left - Canvas.TextHeight(AText)) div 2) - 2;
      TextPosition.Y := ARect.Bottom -
        ((ARect.Bottom - ARect.Top - Canvas.TextWidth(AText)) div 2);
      Canvas.TextOut(TextPosition.X, TextPosition.Y, AText);
    end
    else
      inherited DrawCellText(ACol, ARow, ARect, AState, AText);
 end;
 

Dreht er mir die Schrift in beiden StringGrids in der ersten Zeile (nicht erwünscht)



Mach ich es jedoch so (Und ändere den Typ von TStringGrid1 auf TMyStringGrid (sowohl im QuellCode als auch in der *.lfm-Datei)):
Code: Alles auswählen
 
type
  TMyStringGrid = class(Grids.TStringGrid)
  protected
    procedure DrawCellText(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState; AText: String); override;
  end;
 
 
implementation
 
procedure TMyStringGrid.DrawCellText(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState; AText: String);
 
  var TextPosition: TPoint;
 
 begin
     if aRow = 0 then
     begin
      Canvas.Font.Orientation := 900;
      TextPosition.X := ARect.Left +
        ((ARect.Right - ARect.Left - Canvas.TextHeight(AText)) div 2) - 2;
      TextPosition.Y := ARect.Bottom -
        ((ARect.Bottom - ARect.Top - Canvas.TextWidth(AText)) div 2);
      Canvas.TextOut(TextPosition.X, TextPosition.Y, AText);
    end
    else
      inherited DrawCellText(ACol, ARow, ARect, AState, AText);
 end;
 


Dreht er mir den Text in keinem der beiden StringGrids, und die Routine TMyStringGrid.DrawCellText wird auch gar nicht erst aufgerufen.

Bitte um den entscheidenden Rippenstoß
Christian
Früher war alles besser. Und aus Holz!
AlterMann
 
Beiträge: 196
Registriert: 13. Dez 2009, 09:43
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7prof 64bit - Lazarus 1.6 r51630 FPC 3.0.0 i386-win32-win32/win64 | 
CPU-Target: x86 64Bit
Nach oben

Beitragvon Michl » 12. Feb 2017, 13:53 Re: Überschriebene Prozedure wird nicht aufgerufen

Das, was du bei Variante 1 machst, ist ein Hack. Du überschreibst quasi das TStringGrid mit einem eigenen TStringGrid. Daher tritt jedes Verhalten, was du änderst bei jedem TStringGrid auf dem entsprechendem Formular auf.

Sauber wäre Variante 2. Dazu müsstest du allerdings auch ein TMyStringGrid auf dem Formular verwenden. Entweder du fügst es dynamisch hinzu oder du erstellst eine eigene Komponente, die das TMyStringGrid veröffentlicht. Ein bischen veraltet, doch vielleicht hilft es: http://wiki.freepascal.org/How_To_Write_Lazarus_Component/de

[Edit] Achso, wenn du weiterhin den Hack verwenden willst, könntest du auch einfach in der Methode abfragen, um welches Grid es sich handelt und wenn es das richtige ist, den Text drehen. Empfehlen würde ich es nicht, da man so über die Jahre einen schönen Mischmasch bekommt, den man später einmal nicht mehr entwirrt bekommt.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2056
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon AlterMann » 12. Feb 2017, 14:14 Re: Überschriebene Prozedure wird nicht aufgerufen

Michl hat geschrieben:Sauber wäre Variante 2. Dazu müsstest du allerdings auch ein TMyStringGrid auf dem Formular verwenden. Entweder du fügst es dynamisch hinzu oder du erstellst eine eigene Komponente, die das TMyStringGrid veröffentlicht. Ein bischen veraltet, doch vielleicht hilft es: http://wiki.freepascal.org/How_To_Write_Lazarus_Component/de

Das heißt also: Egal welchen Typ ich in meinem Quelltext hinter StringGrid1 schreibe, wenn ich eine Componente vom Formular einfüge, nimmt Lazarus den Typ den es vorher hatte? Wie wäre es wenn ich das StringGrid zur Laufzeit erst erzeuge?

[Edit] Achso, wenn du weiterhin den Hack verwenden willst, könntest du auch einfach in der Methode abfragen, um welches Grid es sich handelt und wenn es das richtige ist, den Text drehen. Empfehlen würde ich es nicht, da man so über die Jahre einen schönen Mischmasch bekommt, den man später einmal nicht mehr entwirrt bekommt.


Daran hab ich auch schon gedacht. Nachdem das auch nur ein kleines "SpinOff" meines Hauptprojektes ist, werd' ich's wohl auch so machen.

Danke
Christian
Früher war alles besser. Und aus Holz!
AlterMann
 
Beiträge: 196
Registriert: 13. Dez 2009, 09:43
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7prof 64bit - Lazarus 1.6 r51630 FPC 3.0.0 i386-win32-win32/win64 | 
CPU-Target: x86 64Bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 4 Gäste

porpoises-institution
accuracy-worried