Autor Beitrag
MrZBot
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 15.07.09 18:40 
Hey Community

Ich brauche Hilfe!

Wie kann ich auf eine Paintbox drauf eine Schrift transparent zeichnen, die sich selbst wieder überschreibt? Ich will einen Zähler auf eine Paintbox drauf machen, die aber nicht überschrieben werden darf. Der Zähler selber muss sich natürlich insich schon überschreiben, sonst erkennt man nichts. Nur: wie mache ich das?

P.S.: Ich bin ein Anfänger
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mi 15.07.09 18:45 
Hmm...
das Thema wird wohl öfter angesprochen - z.B. hier:
TLabel auf einem TPaintBox zur Laufzeit erstellen.
MrZBot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 15.07.09 18:52 
Zitat:
Du musst Parent auf das Formular setzen!
bitte was?
was hat das mit Parent auf sich? oO

edit: ich habe bereits versucht, ein label transparent vor die Paintbox zu setzen. das geht nicht. die paintbox wird trotzdem überschrieben
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 15.07.09 21:23 
Wie stellst du dir das vor? Wenn du etwas vor die PaintBox zeichnest, dann ist der Inhalt der PaintBox an der Stelle nun einmal verloren. Was normalerweise auch kein Problem ist, da eine PaintBox normalerweise ja in OnPaint einfach sich selbst neu zeichnet bei Bedarf oder wenn man es manuell auslöst.
MrZBot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 16.07.09 12:33 
Die paintbox soll eine Grafik enthalten, die vorher einmal erstellt wurde. nun soll darauf ein zähler laufen. sieht aber grässlich aus wenn dieser nicht transparent ist...
Edit: was meinst du mit
Zitat:
Was normalerweise auch kein Problem ist, da eine PaintBox normalerweise ja in OnPaint einfach sich selbst neu zeichnet bei Bedarf oder wenn man es manuell auslöst.
? Kann ich damit "verlorene" Stellen also wieder herstellen ohne die Grafik neu zu berechnen? Wenn ja, das würde vollkommen ausreichen. Wie ginge das denn?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 16.07.09 19:49 
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Do 16.07.09 21:23 
Huch, noch ein Tread dazu...
Naja, war di etipperei im anderen umsonst. ;)

Also wenn die Paintbox ein Bild enthält geht das automatisch verloren wenn sich ein anderes darüber befindet oder befand.
Dann muss alles neu gezeichnet werden.
Ist da ein Image nich angebrachter ?

Was willst du denn machen? Ändert sich denn in Irgend einer Weise die Graphic in der Paintbox ?

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
MrZBot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Fr 17.07.09 13:53 
Nein, die Paintbox enthält lediglich eine Grafik, welche nur einmal im Programm berechnet wird. Kann ich die Paintbox etwa einfach zu einem Image machen?
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Fr 17.07.09 15:04 
Um deine Frage zu beantworten, nein. Es kommt darauf an wie du die Graphic erstellst.

Also:
* erstelle ein (T)Bitmap und zeichne darauf dein Bild
* erstelle ein weiteres Bitmap in ein Stück deines Bildes kommt um den Hintergrund des Texttes zu löschen
* zeichne es im PaintboxPaint-Event mit Paintbox.Canvas.Draw(0,0, Bitmapname) in die Paintbox
* zeichne nun dein "Label" also den Text per Paintbox.Canvas.TextOut(...) darüber
* fertig.

Oder;
* erstelle ein (T)Bitmap und zeichne darauf dein Bild
* weise einem (T)Image dein Bild zu per ImageX.Picture.Assign(Bitmapname)
* klatsche ein Label auf das Image und erfreue dich ggf. an dem Geflacker

;)

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 17.07.09 15:49 
Hallo,
user profile iconMrZBot hat folgendes geschrieben Zum zitierten Posting springen:
Nein, die Paintbox enthält lediglich eine Grafik, welche nur einmal im Programm berechnet wird.
genau da ist der Vorschlag von user profile iconjaenicke umzusetzen.
Du erstellst einmal im Programm die Grafik auf einem OffScreenBitmap. Das wird in OnPaint bei Bedarf auf der PaintBox ausgegeben + zusätzlich dein Zähler. Einen neuen Zähler kannst Du dann duch Aufruf von PaintBox.Paint ausgeben.

So im Groben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
//Felder für OffScreenBitmap und Zähler
  private
    FBitMap : TBitMap;
    FCounter : Integer;

//FormCreate
  FBitMap := TBitMap.Create;
  FCounter := 0;
  // Grafik zeichnen

//DormDestroy
  FBitMap.Free;

//PaintBoxPaint
  // Grafik von FBitMap auf PaintBox ausgeben
  if Counter <> 0 then
    // Zähler über Grafik zeichnen TextOut( Counter) ...

//ButtonClick zum verändern der Zähleranzeige
  inc(FCounter);
  PaintBox.Paint:


Ps.: meine Vorposter haben das im wesentlichen auch so vorgeschlagen, aber vielleicht wird es so deutlicher.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
MrZBot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 19.07.09 20:08 
Also ich sehe das richtig, es gibt keinen sehr einfachen Weg? ^^

dannw erde ich das fürs erste mal umgehen...ich will den Code ja auch verstehen und in den Beispielen hier habe ich eig fast immer höchstens die Hälfte verstanden...ich bin noch zu frisch in Delphi ;-)


@ Lannes
user profile iconMrZBot hat folgendes geschrieben Zum zitierten Posting springen:
P.S.: Ich bin ein Anfänger
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Sa 01.08.09 16:25 
Es ist wirklich ganz einfach. Du musst dir nur vorstellen dass du halt nicht direkt auf die Paintbox malst, sondern erstmal auf ein Bild das sich unsichtbar im Speicher befindet, und dieses Bild wird dann so oft wie du es brauchst auf die Paintbox übertragen. Vermutlich hast du noch nie Komponenten zur laufzeit erzuegt, aber das geht ganz einfach. Du deklarierst sie wie eine Variable, und musst sie dann vor dem ersten Verwenden noch erzeugen, wie meine Vorposter bereits gezeigt haben, aber hier nochmal ganz einfach:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  Form1: TForm1;
  Bild: TBitmap;  // <--- hier wird dein Bild als Variable deklariert

procedure TForm1.FormCreate(Sender: TObject);
begin
// OnCreate von Form1
  Bild := TBitmap.Create;; //<--- hier wird es erzeugt
  Bild.width := 100;   // Das Bild sollte so groß und breit sein
  Bild.heigth := 100;  // Wie deine Paintbox
end;


Wenn du korrekt vorgehen willst solltest du es dann OnDestroy vom Form wieder freigeben mit bild.free.

Auf das Bild kannst du genauso malen wie auf die Paintbox, halt bild.canvas statt Paintbox.canvas

Um Das Bild auf die Paintbox zu übertragen machst du an der Stelle wo früher Paintbox.canvas.maleirgendwas stand Paintbox.Canvas.Draw(0,0,Bild); und fertig. Damit bleibt dein Bild immer schön gespeichert und du kannst es jederzeit wieder herstellen. Anschließend kannst du wenn du magst direkt auf die Paintbox deinen Coutdown malen, oder dazu ein zweites TBitmap-Bild verwenden... ganz nach deinem Geschmack.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
MrZBot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 02.08.09 17:50 
Danke Tilman, jetzt habe ich es mit deiner Hilfe hingekriegt. Mag sien, dass die voherigen Poster dasselbe meinten, ich habe aber erst deinen Beitrag verstanden ^^