![]() |
FillRect(Rect) geht und in der Unterprocedure geht es nicht
Ich habe einmal
Delphi-Quellcode:
von hier
PROCEDURE TMainForm.ColorGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); BEGIN WITH ColorGrid.Canvas DO BEGIN CASE (ACol * ARow) MOD 11 OF 0: Brush.Color := clBtnFace; 1: Brush.Color := clYellow; 2: Brush.Color := clWhite; 3: Brush.Color := clBlue; 4: Brush.Color := clRed; 5: Brush.Color := clNavy; 6: Brush.Color := clMaroon; 7: Brush.Color := clGreen; 8: Brush.Color := clAqua; 9: Brush.Color := clFuchsia; 10: Brush.Color := clPurple; END; IF (ColorGrid.Selection.Left = ACol) AND (ColorGrid.Selection.Top = ARow) THEN Brush.Color := clLime; FillRect(Rect); Font.Color := Brush.Color XOR 65535; TextOut(Rect.Left, Rect.Top, ColorGrid.Cells[ACol, ARow]); END; END; ![]() Das geht auch und in meinem Programm geht es so auch aber wenn ich das so umbauen will, weil ich viel Grids hab die unterschiedlich eingefärbt werden sollen hab ich gemacht
Delphi-Quellcode:
Also quasi einen Parameter dazu gemacht welche Spalten er einfügen soll und dann sieht die GridColor Procedure so aus
procedure Tfrm_Objektuebersicht.stg_patenschaftenDrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var reihen : Array od Integer; begin setlength(reihen,1); reihen[0] := 1; Gridcolor(Sender,ACol, ARow, Rect, State, reihen); end;
Delphi-Quellcode:
leider mault er dann =>
procedure Gridcolor(Sender: TObject;
ACol, ARow: Integer; Rect: TRect; State: TGridDrawState; geldrows : Array of Integer); var check : boolean; i : integer; begin with Sender as TStringgrid do begin WITH Canvas DO BEGIN check := false; for i := 0 to length(geldrows)-1 do begin if ARow = geldrows[i] Then check := true; end; if (ARow <> 0) AND (check) then Brush.Color := schriftfarbe else Brush.Color := gridhintergrund; END; IF (Selection.Left = ACol) AND (Selection.Top = ARow) THEN Brush.Color := clLime; FillRect(Rect); Font.Color := Brush.Color XOR 65535; TextOut(Rect.Left, Rect.Top, Cells[ACol, ARow]); END; end; end; Zitat:
|
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Zitat:
|
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Zitat:
//eidt: zu langsam ;) Mfg Frank |
hmm,
upps, dank euch. Tolle Fehlermeldung, so schön passend :( Das END; ist wohl noch von der Caseanweisung hängen geblieben :(
|
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Klage nicht ...
Du wolltest Canvas.FillRect aufrufen, hast aber tatsächlich - durch das fehlende End - die API-Funktion FillRect aufgerufen. Die hat nun mal andere Parameter. Nebenbei: Die Fehlermeldung stand doch nicht alleine, oder? Spätestens am Ende der Fehlermeldungen muss doch irgendetwas von einem fehlenden End gestanden haben, bzw. dass "End." nicht korrekt ist. |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Nicht "fehlend" sondern zuviel.
|
hmm,
@Tom
nicht wirklich, k.a. , ich hab in dem Projekt 87 Hints und 43 Warnings, da guck man nimmer so genau ;) |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Dann solltest Du als erstes mal dafür sorgen, dass die Meldungen sich auf Null reduzieren. Schließlich möchte Dir der Compiler mit diesen etwas mitteilen.
|
hmm,
Delphi-Quellcode:
was soll ich gegen sowas machen ?
[Warning] dlg_arbeitstagekalender.pas(45): Method 'Create' hides virtual method of base type 'TCustomForm'
Und die Hints sind meist von Variablen die in Proceduren nimmer gebraucht werden etc.. Das übliche halt, damit hab ich keine Probleme. |
Re: hmm,
Zitat:
Zitat:
|
Re: hmm,
Zitat:
Zitat:
Ansonsten: Tick, Tick, Tick ... |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
@jbg
Geht net, das Create ist überladen, also ist nix mit Override ;) Iss ja ein OVERLOAD. @Tom Zitat:
Ich weiss, es geht um Prinzip aber nicht alles was der Compiler sagt muss auch wirklich schädlich sein sondern ist einfach eine Fehleinschätzung ! |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Zitat:
|
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Zitat:
Zitat:
Und was, wenn mal eine Funktion aus irgendeinem sehr sehr unwahrscheinlichen Grund mal fehlschlägt? Mit GetMem/New/AllocMem kann man schön arbeiten. Aber es kann auch mal vorkommen, dass der Speicher nicht mehr ausreicht und dann kommt das FreeMem/Dispose und man hat die Bescherung. |
hmm,
@jbg
Der Code :
Delphi-Quellcode:
@tom
public
{ Public declarations } constructor Create(Aowner:Tcomponent);OVERLOAD; constructor Create(Aowner:Tcomponent;ab:TDate;uetage:integer);OVERLOAD; end; implementation {$R *.DFM} uses mdimain; constructor Tfrm_dlg_Arbeitstagekalender.Create(Aowner:Tcomponent); begin inherited create(Aowner); aufrufart := 0; end; constructor Tfrm_dlg_Arbeitstagekalender.Create(Aowner:Tcomponent;ab:TDate;uetage:integer); begin inherited create(Aowner); aufrufart := 1; tage := uetage; abdatum := ab; end; war ein doofes Beispiel ein anderes, was ich unsprünglich gemeint hatte zB. Zitat:
Zitat:
|
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Was hindert Dich daran einen Doppelklick auf die Meldung durchzuführen und den Source kurz zu korrigieren? Das sind ein paar Sekunden Arbeit.
Dann kannst Du Dir wenigstens immer alle Meldungen/Warnungen ansehen und mögliche Fehlerursachen beheben. Bei Deiner Vorgehensweise ist es zu aufwendig die echten Meldungen/Warnungen heraus zusortieren. Im Ergebnis korrigierst Du also einige Fehler nicht und Dein Programm ist eine Zeitbombe. |
hmm,
falsch, ich korrigiere Fehler, ich entferne aber nichts rudimäntäres was man vielleicht mal wieder brauchen könnte, es wurde ja schon einmal gebraucht, warum sollte es also nicht wie in gebrauch kommen ?
|
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Moin Joel,
Zitat:
|
hmm,
warum sollte ich zB. Felder aus einem Query entfernen ?
von der Geschwindigkeit abgesehen ? |
Re: hmm,
Zitat:
Delphi-Quellcode:
public
{ Public declarations } constructor Create(Aowner: TComponent); overload; override; constructor Create(Aowner: TComponent; ab: TDate; uetage: Integer); overload; end; |
hmm,
welche Gefahren drohen mir wenn ich das weg lassen ?
Ich meine nicht dass ich es mir nicht merken würde aber warum das ganze ? Es ist doch total wurscht, der Constructor hat null nachteile durch meine Deklaration. Ich sehe nicht wie man mich bescheissen könnte :( Vor allem macht dieses OVERRIDE mich eher stutzig, ich will das nicht wirklich OVERRIDEN, ich will verschiedene Konstruktoren haben die auch alle aufgerufen werden im Projekt.Da ist mir Delphi noch etwas suspekt aber ich mach es ja auch erst 3 Monate. |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Das hat 2 Gründe.
[edit=Daniel B]List-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
@jbg
zu 1) *gg* zu 2) versteh ich jetzt nicht. Das ist doch das Prob des COmpilers und nicht des Programmierers. Wenn ich Create zuerstmal überschreibe, was anderes mache ich ja nicht mit
Delphi-Quellcode:
Denkt euch das OVERLOAD weg und ersetzt es durch OVERRIDE !!
constructor Create(Aowner:Tcomponent);OVERLOAD;
Wenn ich jetzt aber auch einen anderen aufruf brauche , dann überschreib ich das ganze einfach, denn IMHO sichert im Konstruktor
Delphi-Quellcode:
das
constructor Tfrm_dlg_Arbeitstagekalender.Create(Aowner:Tcomponent);
begin inherited create(Aowner); aufrufart := 0; end;
Delphi-Quellcode:
eh dass der ursprüngliche Konstruktor zum Einsatz kommt !
inherited create(Aowner)
Wo ich allerdings noch nicht klar Delphi verstehe ist dass man wohl Konstruktoren vererben kann oder wie, dass ist natürlich ein Killer denn Sinn macht es nicht. Kein Konstruktor kann seine Childclass konstruieren, das wiederspricht ja den Sinn der Vererbung, denn dann ist die CHildclass ja nix anderes wie eine Instanz der Elternklasse . Meine Meinung aber die Diskussion ist interessant auch wenn Tom nimmer antwortet, ist Wochenende !? |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Zitat:
Ignoriere weiter Deine Meldungen/Warnungen und sei glücklich. Ich kümmer mich drum und bin auch glücklich :roll: Zitat:
|
hmm,
schad.
Denn wo ist denn de Falle bei erner Variable die nie gebracuht wird ?? Ich verstehe es echt nicht. Wenn man vielleicht mit globalen Variablen hantiert kannes zum Killer werden aber wer Globale verwendet gehört eh gesteinigt ! |
Re: hmm,
Zitat:
Zitat:
|
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Zitat:
Delphi-Quellcode:
Dafür braucht man virtuelle Konstruktoren. Und das wird von der VCL intern sehr stark genutzt.
function NewComponent(ComponentClass: TComponentClass): TComponent;
begin Result := ComponentClass.Create(nil); end; // ... var C: TComponent; begin C := NewComponent(TMyComponent); try // ... finally C.Free; end; end; [edit=Luckie]Quate-Tags gefixet. Mfg, Luckie[/edit] |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
@Tom
wieso versinke ich, ich ignoriere einfach. @jbg das muss ich erst nachlesen, da bin ich ehrlich da komm ich gerade nicht mit. Aber wen ich es sehe dann verstehe ich dein Argument nicht. Ich bin der Gott und nicht der Compiler, also hat der Compiler zu verstehen was ich will und nicht umgekehrt. Ich bin kein meister der virtuellen Funktionen aber ich sehe das so, wenn der Compiler es nicht versteht dann sollte es nicht angeboten werden denn die untergräbt die Konsistenz des gesamten gGebildes ! |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Zitat:
|
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
falsch, ich habe nicht die verbindung zwischen der Fehlermeldung und der Ursache gesehen, natürlicvh kann man sagen dass ich der Fehler im System bin, bin ich ja auch. Aber das liegt nicht an den anderen Fehlern, denn wie gesagt, es wurden keine weiteren Folgefehler gezeigt, wie auch ?
Wenn ein End fehlt dann kommt das ein ; expected sit und ein Procedure kam, aber wenn ein END; zuviel ist wird dei folgeNachricht zur HDC expected TRect found oder wie auch immer. Das ist IMHO ein himmelweiter unterschied ! Wie auch immer, wenn es dir eh müssig ist warum ahst du dann nicht meine Fragen beantwortet ? |
Re: FillRect(Rect) geht und in der Unterprocedure geht es ni
Zitat:
Zitat:
Solange du deine Komponente nur für dich benutzt, keine abgeleitete Klasse davon erzeugst und sie nie in der IDE als Komponente registierst, sie also immer per Quellcode erzeugst, kann nie was passieren. Machst du aber nur eines dieser drei Dinge, so platzt die Zeitbome. |
hmm,
was könnte denn passieren ?
Wenn ich den Konstruktor überlade und immer mit inherted(Create) den Ursprung mit einpacke ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz