Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Item in DrawItem ändern? (https://www.delphipraxis.net/180830-item-drawitem-aendern.html)

DeddyH 21. Jun 2014 18:54

AW: Item in DrawItem ändern?
 
Und aus diesem Grund ist das in meinen Augen inakzeptabel.

mkinzler 21. Jun 2014 18:58

AW: Item in DrawItem ändern?
 
In meinen Augen auch, aber das könnte auch daran liegen, dass ich kein so Genie wie Popov oder Mattze bin, sondern nur ein durchschnittlicher Programmierer, der alles an den Stellen macht, die dafür vorgesehen sind!

Mattze 21. Jun 2014 19:57

AW: Item in DrawItem ändern?
 
Hallo Marcus,

ich halte mich nicht für ein Genie oder solltest Du zynischherweise das Gegenteil gemeint haben?
Gab es da nicht mal sowas wie Nettikette auf deren Einhaltung ein Moderator zu achten hat?

Entschuldige, aber ich dachte tatsächlich, man könne in diesem Forum Fragen stellen über Dinge, die man nicht weiß und die einem aufgefallen sind. Und dass das ohne Beleidigung möglich ist.

Wenn Dich etwas stört, dann antworte doch einfach nicht!

Mattze

Perlsau 21. Jun 2014 20:12

AW: Item in DrawItem ändern?
 
Naja, bei völlig sinnfreien Anliegen wie dem deinen kann es schon mal geschehen, daß man was entgegnet, das den Anfänger verletzen könnte. Anders ausgedrückt: Bevor du was unterstellst, solltest du erst einmal zu klären suchen, ob dein Winken mit der Netiquette nicht vielmehr auf Einbildung beruht ...

Zitat:

Zitat von Mattze (Beitrag 1263144)
Wenn Dich etwas stört, dann antworte doch einfach nicht!

Ist dir vielleicht aufgefallen, daß ausnahmslos alle Antworter dir die Sinnlosigkeit deines Vorhabens bescheinigt haben? Vielleicht sollte man auf deine Fragen besser gar nicht mehr antworten?

EWeiss 21. Jun 2014 20:38

AW: Item in DrawItem ändern?
 
Zitat:

Zitat von mkinzler (Beitrag 1263142)
In meinen Augen auch, aber das könnte auch daran liegen, dass ich kein so Genie wie Popov oder Mattze bin, sondern nur ein durchschnittlicher Programmierer, der alles an den Stellen macht, die dafür vorgesehen sind!

Nehme niemand in Schutz desto trotz kann ich nicht erkennen das hier irgend jemand Beleidigt wurde.

gruss

Popov 21. Jun 2014 20:41

AW: Item in DrawItem ändern?
 
Ich glaube es war Sir Edmund Hillary, der erste erfolgreicher Besteiger des Mount Everest, den man fragte, wieso er diesen Berg bestiegen hat? Er antwortete: weil er da ist.

Es gibt keinen nützlichen Grund einen solchen Berg zu besteigen. Keinen. Auch gibt es keinen nützlichen Grund nach Exoplaneten zu suchen, denn selbst wenn man welche finden würde, die man als Mensch bewohnen kann, die Entfernungen sind einfach zu gewaltig. Und das ist nicht nur eine Frage der Zeit und Technik.

Natürlich kann man hier und da sich fragen welchen Sinn etwas hat, aber genau so wie z. Brainstorming konzeptionell davon ausgeht, dass es keine dumme Ideen gibt, sondern aus einer weniger guten Idee durchaus eine gute Idee entstehen kann, kann man sich darüber unterhalten ob es weniger guten Code gibt? Oder führt jeder Code dazu seine Grenzen zu erweitern?

himitsu 21. Jun 2014 21:44

AW: Item in DrawItem ändern?
 
Adrenalinkick, Ruh, Ehere, ein erfüllter Traum und man hat einen geilen Ausblick.

Es hat auch absolut keinen Sinn das Haus zu verschieben, nur weil es im Keller zu dunkel ist und dennoch macht das Keiner, da es "bessere" Lösungen gibt.

Mattze 22. Jun 2014 05:18

AW: Item in DrawItem ändern?
 
Hallo,

ICH halte die Frage nach den Grenzen eines Konzepts für durchaus berechtigt, auch wenn sie zunächst einmal dem einen oder anderen sinnfrei erscheint!

Übrigens: Eigentlich dürfte es nicht gehen, aber erstaunlicherweise scheint es doch zu funktionieren.

Delphi-Quellcode:
 
  if (index>Ftempindex) and Assigned(FOnBeforeDrawItem) then begin
    FOnBeforeDrawItem(Self, Index, Rect, State);
    FTempIndex:=index;
    exit;
  end;
im neuen DrawItem am Anfang tut es.
(FTempIndex ist eine Integer-Variable aus dem private-Bereich der neuen Listbox-Komponente und wird in Create mit -1 initialisiert.)

Es gibt noch beim ersten (und zweiten?) vertikalen Scrollvorgang ein kleines Problem, aber sonst sieht es schon gut aus und das ist verschmerzbar.

Gruß
Mattze

PS: Warum gibt es für Perlsau eigentlich nur Genie oder Anfänger?

Dejan Vu 22. Jun 2014 08:29

AW: Item in DrawItem ändern?
 
Ich finde Mattzes Ansinnen, Fragestellung, Argumenation und Vorgehensweise absolut ok. Dieses 'völlig sinnfreie Anliegen' ist ein sehr wichtiger Bestandteil einer für viele vermutlich komplett überflüssigen Tätigkeit, die unsere Gesellschaft zwar weiterbringt ('Fortschritt'), aber jedoch im eigentlichen Sinne unproduktiv und für Laien teilweise auch blödsinnig ist.

Diese offensichtlich für Einige bekloppte Tätigkeit nennt sich: Forschen und basiert in erster Linie auf Wissensdurst. Und dieser Durst nach Wissen kann nur gestillt werden, wenn Vorbehalte ("Das braucht man doch nicht", "Geht auch anders", "völlig Sinnfrei") mal außen vor gelassen werden. Diese Vorbehalte kommen in der Anwendung zum Einsatz (und sind Antrieb von so etwas wie Wirtschaftlichkeit), haben in der Forschung jedoch nichts zu suchen.

Für Einige scheint Forschung und Programmieren nichts miteinander zu tun zu haben.

Zum Thema: Endllosschleifen in ereignisgesteuerten Programmabläufen lassen sich zuverlässig über Markierungen vermeiden. Grundsätzlich geht da so:
Delphi-Quellcode:
Procedure MyEventHandler(SomeObject : TSomeObject);
Begin
  If IsHandled[SomeObject] then exit;
  IsHandled[SomeObject] := true;
  Try
    DoSomeThingWith(SomeObject); // <<< Löst das Ereignis 'MyEvent' erneut aus
  Finally
    IsHandled[SomeObject] := false;
  End
End;
Eine andere Vorgehensweise ist die, einen die Schleife auslösenden Aufruf nur dann auszuführen, wenn es unbedingt nötig ist. Ein Beispiel ist ein Grid, welches die Spaltenbreite automatisch anpasst, wenn der darzustellende Text breiter als die augenblickliche Spaltenbreite ist. Dann wird die Breite ja nur gesetzt, wenn die Spalte noch nicht breit genug war. Hier findet zwar ein rekursiver Aufruf statt, aber nach dem ersten Aufruf ist Schluss, da die Breite ja beim 2. Aufruf passt.
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  sg : TStringGrid;
begin
  if not (Sender is TStringGrid) then exit;
  sg := TStringGrid(Sender);
  w := sg.Canvas.TextWidth(sg.Cells[aCol, aRow]);

  if w>sg.ColWidths[aCol] then
    sg.ColWidths[aCol] := w; // <<< löst ein erneuten Aufruf von DrawCell aus!
  ...
end;
Hier würde ich vermutlich den zweiten Ansatz nehmen, denn der Text muss ja nur verändert werden, wenn noch nicht geändert wurde.

Eigentlich ist das 2.Pattern eine Spezialisierung des 1.Patterns, denn das [Delphi]IsModified[SomeObject][/delpi] wird ja durch die Änderung des Objekts abgebildet.

himitsu 22. Jun 2014 09:19

AW: Item in DrawItem ändern?
 
Zitat:

Zitat von Dejan Vu (Beitrag 1263164)
Ich finde Mattzes Ansinnen, Fragestellung, Argumenation und Vorgehensweise absolut ok.

OnDraw ist zum Malen da und hat nichts an den Daten zu ändern.

Und ja, ich kenn einige Komponenten, welche jedesmal im OnDraw irgendwelche Daten überschreiben, oder erst dort Operationen ausführen, welche eigentlich in ein OnChange reingehören würden.
Das Verhalten solcher Komponenten ist völlig undurchschaubar, da gedade das Paintereignis an unbestimmter Stelle ausgeführt wird und wozu soll ein einmaliges Ereignis bei jeder Zeichenoperation ausgeführt werden?

Vorallem der Code in #16 ist ein gutes Beispiel.
Jenachdem wie oft das Ding gezeichnet werden muß, steht jedesmal was Anderes drin.


Und ja, wenn man was am Ausgabeformat oder den Daten ändert, dann muß sich das Ding doch neu zeichnen.
Drum macht man sowas auch nicht in einer Zeichenoperation.

Wenn man vollkommene Freiheit haben will, dann nimmt man eben sowas wie das VirtualTreeView oder (falls die Komponente es kann) versetzt die komponente in einen virtuellen Modus,
wo man im OnPaint alles anzeigen kann, was man will.
Aber auch da gilt, daß man z.B. an der Item-Größe nicht erst im OnPaint rumzuspielen hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.
Seite 3 von 4     123 4      

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