[Gelöst] Verwendung von Heaptrc-Unit führt zu anderer Grafikausgabe

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
ArchChem
Beiträge: 83
Registriert: Mo 11. Jul 2022, 10:41

[Gelöst] Verwendung von Heaptrc-Unit führt zu anderer Grafikausgabe

Beitrag von ArchChem »

Einen schönen Sonntagabend in die Runde,

ich habe ein etwas skurriles Problem und möchte fragen, ob mir da jemand auf die Sprünge helfen kann. Ich habe eine ListBox, die ich vollständig selbst zeichne (lbOwnerDrawVariable). Die eigentliche Zeichnung mache ich mittels eines BGRABitmap und kopiere sie dann auf das Canvas der Listbox. Das funktioniert soweit, solange ich die Heaptrc-Unit verwende (Unter Projekt->Projekteinstellungen->Debuggen), und sieht so aus:
Mit heaptrc-Unit (Wie es aussehen soll)
Mit heaptrc-Unit (Wie es aussehen soll)
bild-inordnung.png (130 KiB) 4222 mal betrachtet
Wenn ich nun aber die Heaptrc-Unit nicht verwende (ohne -gh), habe ich eine flackerhafte Ausgabe, welche so aussieht:
Ohne heaptrc-Unit
Ohne heaptrc-Unit
bild-nichtinordnung.png (34.6 KiB) 4222 mal betrachtet
Mein Code zur Grafikanzeige:

Code: Alles auswählen

procedure TfrmSongs.SlideTextListBoxDrawItem(Control: TWinControl;
  Index: Integer; ARect: TRect; State: TOwnerDrawState);
var
  ABitmap:TBgraBitmap;
begin
  if Index > SlideTextListBox.Count then Exit;

  ABitmap := TBgraBitmap.Create;
  ABitmap.FontHeight:=Round(Screen.SystemFont.Height/0.75);
  ABitmap.FontName:=Screen.SystemFont.Name;
  ABitmap.FontQuality:=fqFineAntialiasing;
  if frmPresent.SlideList.Items[Index].SlideType = TitleSlide then
  begin
     ABitmap.FontStyle+=[fsBold];
     ABitmap.DrawLine(2,2,ARect.Width,2,clBlack,true);
  end;
  ABitmap.SetSize(
                  ARect.Width,
                  ABitmap.TextSize(SlideTextListBox.Items[Index],SlideTextListBox.Width).Height + 10
                  );
  if SlideTextListBox.ItemIndex=Index then
    ABitmap.FillRect(3,3,ABitmap.Width-3, ABitmap.Height-3, clActiveCaption, dmSet);
  ABitmap.DrawLine(0,0,0,ARect.Height,clBlack,True);
  ABitmap.DrawLine(ARect.Width-2,0,ARect.Width-2,ARect.Height,clBlack,True);
  ABitmap.TextRect(Rect(5,5,ABitmap.Width-5, ABitmap.Height-5),
                    SlideTextListBox.Items[Index], taLeftJustify, tlTop,
                    ColorToRGB(clBtnText)
                    );
  if (Index >= frmPresent.SlideList.Count-1) or
     (frmPresent.SlideList.Items[Index].Song.FileNameWithoutEnding <>
     frmPresent.SlideList.Items[Index+1].Song.FileNameWithoutEnding) then
     ABitmap.DrawLine(0,ARect.Height-2,ARect.Width,ARect.Height-2,clBlack,true);

  ABitmap.Draw(SlideTextListBox.Canvas, ARect.Left, ARect.Top, true);
  ABitmap.Destroy;
end;      
Hat da jemand eine Idee, warum die heaptrc-Unit die Grafikanzeige verändert? Sie ist doch eigentlich nur für das Debuggen gedacht?!

Viele Grüße und Danke!
Zuletzt geändert von ArchChem am So 10. Mär 2024, 21:14, insgesamt 1-mal geändert.

ArchChem
Beiträge: 83
Registriert: Mo 11. Jul 2022, 10:41

Re: Verwendung von Heaptrc-Unit führt zu anderer Grafikausgabe

Beitrag von ArchChem »

Ich habe den Fehler ausfindig machen können, ohne allerdings den Grund zu verstehen. :D ABitmap.SetSize darf an der Stelle im Code nicht verwendet werden, ich gebe nun die Größe schon bei der Erstellung des BGRABitmaps mit, dann funktioniert es.

Code: Alles auswählen

ABitmap := TBgraBitmap.Create(ARect.Width, ARect.Height);
...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 338
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: [Gelöst] Verwendung von Heaptrc-Unit führt zu anderer Grafikausgabe

Beitrag von Niesi »

Lässt sich die Größe dann später ohne Probleme verändern?
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Antworten