Nach Hause
Top.Mail.Ru Yandeks.Metrika
Forum: "Haupt";
Aktuelles Archiv: 2002.01.08;
Herunterladen: [xml.tar.bz2];

Nach unten

Die Komponente wird nicht gezeichnet, und das ist es ... Finden Sie ähnliche Zweige


Aleksandr   (2001-12-18 13:03) [0]

Liebe Kolleginnen und Kollegen!
Ich musste eine Komponente erstellen. Erstellt durch Spawning von TGraphicControl. Ich lege das Formular an - alles ist in Ordnung, es ist sichtbar, aber es ist nicht gezeichnet, und das ist es ... Der Code ist

Typ
TWayTree = Klasse (TGraphicControl)
privat
...
geschützt
Verfahren Paint, überschreiben;
Öffentlichkeit
Konstruktor Create (AOwner: TComponent);
veröffentlicht
...
property Farbe default clWhite;
property Sichtbarer Standardwert true;
end;

Verfahren registrieren;

Implementierung

Verfahren TWayTree.Paint;
war
ARect: TRect;
beginnen
Geerbt;
Canvas.Brush.Color: = Farbe;
ARect.Left: = Left;
ARect.Top:=Top;
ARect.Bottom: = Top + Height;
ARect.Right: = Left + Width;
Canvas.FillRect (ARect)
end;

Konstruktor TWayTree.Create;
beginnen
Inherited Create (AOwner);
...
end;

Verfahren registrieren;
beginnen
RegisterComponents ("WayTrees", [TWayTree])
end;

Ende.

Außerdem, wenn ich immer noch versuche, die FPen- und FBrush-Eigenschaften hinzuzufügen (für separaten Zugriff in der Entwurfszeit):

TWayTree = Klasse (TGraphicControl)
privat
FPen: TPen;
FBrush: TBrush;
Prozedur RePaintRequest (Sender: TObject);
Prozedur SetBrush (Wert: TBrush);
Prozedur SetPen (Wert: TPen);
geschützt
Verfahren Paint, überschreiben;
Öffentlichkeit
Konstruktor Create (AOwner: TComponent);
Zerstörer Zerstören;
veröffentlicht
property Farbe default clWhite;
Eigenschaft sichtbar;
property Brush: TBrush lesen FBrush schreiben SetBrush;
property Pen: TPen lesen FPen schreiben SetPen;
end;

Verfahren registrieren;

Implementierung

Verfahren TWayTree.Paint;
war
ARect: TRect;
beginnen
Geerbt;
Canvas.Pen: = FPen;
Canvas.Brush: = FBrush;
Canvas.Brush.Color: = Farbe;
ARect.Left: = Left;
ARect.Top:=Top;
ARect.Bottom: = Top + Height;
ARect.Right: = Left + Width;
Canvas.FillRect (ARect);
Canvas.TextOut (ARect.Left, ARect.Top, "AAA");
end;

Zerstörer TWayTree.Destroy;
beginnen
FPen.Free;
FBrush.Free;
Vererbte Zerstörung
end;

Konstruktor TWayTree.Create;
beginnen
Inherited Create (AOwner);
FPen: = TPen.Create;
FBrush: = TBrush.Create;
FPen.OnChange: = RepaintRequest;
FBrush.OnChange: = RepaintRequest
end;

Prozedur TWayTree.SetBrush;
beginnen
Wenn Wert = Null ist
Beenden;
FBrush.Assign (Wert);
Ungültig
end;

Prozedur TWayTree.SetPen;
beginnen
Wenn Wert = Null ist
Beenden;
FPen.Assign (Wert);
Ungültig
end;

Verfahren TWayTree.RePaintRequest;
beginnen
Ungültig
end;

Verfahren registrieren;
beginnen
RegisterComponents ("WayTrees", [TWayTree]);
end;

Ende.
Die Komponente schwört beim Einfügen in eine Form, dass der Stift nicht auf Null gesetzt werden kann. Stift und Pinsel werden im Inspector angezeigt, aber wenn ich auf + klicke, fällt der Nifiga nicht heraus, wenn ich die Komponenten in der Größe verändere, der gleiche Fehler ... Was mache ich hier falsch?



csf   (2001-12-18 13:09) [1]

Delphi neu starten, sagt man, hilft.
Про gelagert du kannst immer noch lesen ...



Aleksandr   (2001-12-18 13:11) [2]

Sorry, ich muss auf die Müllkippe gehen ... Ich habe herausgefunden, dass ich vergessen habe, gegenüber dem Konstruktor den Destruktor zu überschreiben, um zu zeichnen ... Ich frage mich, wie man eine vertikale ScrollBar mit dieser Komponente verbinden kann ...



csf   (2001-12-18 13:19) [3]

... es wäre schön, mit Paint FPen & FBrush nach Null zu fragen ...



Юрий Зотов   (2001-12-18 14:30) [4]

> csf

1. > Starten Sie Delphi neu, heißt es.
Wertvolle Beratung.

2. > Sie können immer noch über die gespeicherten ...
Du kannst Nur zu sabzh hat es nichts zu tun.

3. > ... es wäre gut, mit Paint FPen & FBrush nach Null zu suchen ...
Warum? Sie werden im Komponentenkonstruktor erstellt. Nil kann nicht da sein.

Insgesamt: Du hast 3-Sätze geschrieben und alle 3, entschuldige mich, Scheiße. War es das Schreiben wert? Lohnt es sich überhaupt, Fragen zu beantworten, deren Thema Sie, gelinde gesagt, nicht sehr gut kennen?


> Aleksandr

Sie haben sich bereits damit beschäftigt, sich selbst zu überschreiben, aber das ist noch nicht alles - Sie haben eine doppelte Neuzeichnung:

Prozedur TWayTree.SetBrush;
beginnen
Wenn Wert = Null, dann // Dies ist unnötig und sogar schädlich - es verbirgt Benutzerfehler
Beenden;
FBrush.Assign (Wert); // Generiere FBrush.OnChange und rufe RePaintRequest auf
Invalidate // Das ist überflüssig - es wird wiederholt neu gezeichnet.
end;

Und das gleiche in SetPen. Darüber hinaus ist die ARect-Variable in Paint völlig unnötig - verwenden Sie ClientRect oder Canvas.ClipRect.

Schließlich ist die Hauptsache - ihr FBrush und FPen sind absolut nutzlos - nur zusätzliche Ressourcen werden zerstört. Verwenden Sie den integrierten Canvas:

veröffentlicht
property Pen: TPen lesen GetPen schreiben SetPen;
...

Funktion ... GetPen: TPen;
beginnen
Ergebnis: = Canvas.Pen
end;

Prozedur ... SetPen (const Wert: TPen);
beginnen
Canvas.Pen.Assign (Wert)
end;

Fazit: Auch die einfachsten Komponenten müssen sorgfältiger und sorgfältiger durchdacht werden.



Aleksandr   (2001-12-18 15:50) [5]

2 Yuri Zotov
Danke für die Info. Eine direkte Einwirkung auf die Eigenschaften der Leinwand bewirkt jedoch etwas, das standardmäßig nicht der "Standard" ist - es wird immer in der zuletzt verwendeten Farbe gezeichnet. Dementsprechend kann auf OnChange nichts gepflanzt werden - es gibt eine elementare Schleife. Wenn Sie die Farbe der Leinwand festlegen, wird OnChange ausgelöst. Dies führt zu einer Neuzeichnung, und in der Neuzeichnung ändert sich die Farbe der Leinwand erneut.
Auf der Tagesordnung stand nur eine Frage: Wie packe ich die TScrollBar-Komponente ein? Etwas, das ich nicht doppelt vererben kann - von TGraphicControl und von TScrollBar ...



DieHard   (2001-12-18 16:01) [6]

Doppelte Vererbung funktioniert nicht.
Versuchen Sie, von TScrollBox zu erben.



MBo   (2001-12-18 16:02) [7]

keine doppelte vererbung.
vielleicht von TWinControl erben?



Polevi   (2001-12-18 16:19) [8]

TCustomControl



Aleksandr   (2001-12-18 16:19) [9]

Hmm ... nun, lassen wir das erstmal ... Wie kann man das ständige Flackern von Komponenten bei der Größenänderung eines Formulars vermeiden?



panov   (2001-12-18 16:31) [10]

> Aleksandr © (18.12.01 16: 19)
Versuchen Sie, Enabled: = False einzustellen, bevor Sie die Größe ändern



Юрий Зотов   (2001-12-18 17:25) [11]

> Aleksandr © (18.12.01 15: 50)

> es wird immer in der zuletzt verwendeten Farbe gemalt.

Was ist erforderlich?


> Entsprechend kann auf OnChange nichts gepflanzt werden

Und nicht Ihre Paint-Methode wird automatisch aufgerufen, und es ist nichts anderes erforderlich.

> es wird eine elementare Schleife geben - die Farbe der Leinwand wird festgelegt
> bewirkt OnChange, bewirkt ein erneutes Zeichnen und erneutes Zeichnen
> Leinwandfarbe ändert sich.

Zunächst bestätigen Sie selbst, dass durch das Ändern der Eigenschaften der Leinwand automatisch Ihre Paint-Methode aufgerufen wird. Das bedeutet, dass Sie mit dem vorherigen Punkt einverstanden sein müssen - Sie benötigen keine OnChange-Handler (OnChange-Handler geben nur eine zusätzliche Neuzeichnung an - daher das zusätzliche Blinzeln).

Zweitens ist es NICHT erforderlich, die Eigenschaften der Leinwand beim Neuzeichnen zu ändern. Warum? Wenn Sie die Eigenschaften der Komponente an die Eigenschaften der Leinwand binden, werden diese Eigenschaften der Leinwand beim Aufruf der Paint-Methode BEREITS als erforderlich festgelegt. Zeichne mit ihnen, ohne etwas zu ändern. Und dann wird es keine Schleife geben.

Im Allgemeinen empfehle ich Ihnen, es selbst auszuprobieren. Ich denke, und das Flimmern wird deutlich nachlassen.

Als nächstes über das Flimmern und die ScrollBar - hören Sie den Rat von Polevi. TCustomControl ist ein Fenster. ScrollBars werden dort eingefügt, indem Sie einfach die WS_HSCROLL / WS_VSCROLL-Stile in CreateParams festlegen. Sie können das Flimmern reduzieren, indem Sie die DoubleBuffered-Eigenschaft festlegen.



Seiten: 1 ganze Branche

Forum: "Haupt";
Aktuelles Archiv: 2002.01.08;
Herunterladen: [xml.tar.bz2];

nach oben









Speicher: 0.87 MB
Zeit: 0.043 c
3-21994
Vs
2001-12-06 16:23
2002.01.08
Dynamisches Array


1-22192
Träumer
2001-12-15 19:34
2002.01.08
Ab und zu nur Sekunden ziehen und übertragen


4-22454
Ewgeniy
2001-10-31 07:40
2002.01.08
Anzeige in Form von Grafiken aus dem Speicher


1-22230
Mann in rot
2001-12-15 23:01
2002.01.08
So zeigen Sie die Seriennummer des ausgewählten Zeichens in RichEdite an!


1-22039
Yuri btr
2001-12-18 10:46
2002.01.08
Form





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarian katalanisch Chinesisch (vereinfacht) Chinesische Tradition) kroatisch Tschechisch Dänisch Dutch Englisch estnisch Philippinisch Finnish Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italian Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegian
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Swedish Thai Türkisch Ukrainisch Urdu Vietnamesisch Walisisch Jiddisch Bengalisch bosnisch
cebuano Esperanto Gujarati Hausa Hmong igbo Javanisch kannada khmer Laotisch Lateinisch Maorisch Marathi Mongolisch nepali Pandschabi Somalisch Tamilisch Telugu Yoruba
Zulu
Английский Französisch Deutsch Italienisch Португальский Russisch Spanisch