Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

Mögliche Größen für eine Font ermitteln

  Alt 9. Okt 2006, 16:24
Hallo!

Bezugnehmend auf
http://www.delphipraxis.net/internal...umfontfamilies
und
http://www.delphipraxis.net/internal...umfontfamilies

Wie in den anderen Theman angesprochen möchte auch ich wissen, welche Schriftgrößen eine Schriftart unterstützt.

Es gibt 2 Listboxen, FlbArt (Schriftart) und FlbGrad (Schriftgröße), wobei FlbArt.Items.Assign(Screen.Fonts).

Sobald nun die Callback-Funktion EnumFontSizes aufgerufen wird, stürzt das Programm an der markierten Stelle ab mit der nichtssagenden Fehlermeldung
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt TMyFontDialog.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x004c22fb: read of address 0xffffffff' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Da ich, da es sich um eine Callback-Funktion handelt, FlbGrad nicht als Parameter übergeben kann, weiss ich nicht, was ich nun tun soll...

Delphi-Quellcode:
procedure TMyFontDialog.lbArtClick(_Sender: TObject);
  function EnumFontSizes(var EnumLogFont: TEnumLogFont; PTextMetric: PNewTextMetric; FontType: Integer; Data: LPARAM): Integer; export; stdcall;
  var s: String;
      i,v,v2: Integer;
  begin
    if (FontType and TRUETYPE_FONTTYPE)<>0 then begin
      FlbGrad.Items.Add('8'); // <-- Hier Fehler
      FlbGrad.Items.Add('9');
      FlbGrad.Items.Add('10');
      FlbGrad.Items.Add('11');
      FlbGrad.Items.Add('12');
      FlbGrad.Items.Add('14');
      FlbGrad.Items.Add('16');
      FlbGrad.Items.Add('18');
      FlbGrad.Items.Add('20');
      FlbGrad.Items.Add('22');
      FlbGrad.Items.Add('24');
      FlbGrad.Items.Add('26');
      FlbGrad.Items.Add('28');
      FlbGrad.Items.Add('36');
      FlbGrad.Items.Add('48');
      FlbGrad.Items.Add('72');
      Result := 0;
      end
    end;
  end;
var
  DC: HDC;
  OC: TNotifyEvent;
  Fontname: String;
begin
  if FlbArt.ItemIndex < 0 then exit;
  DC := GetDC(0);
  with FlbGrad do begin
    Items.BeginUpdate;
    try
      Items.Clear;
      PixelsPerInch := GetDeviceCaps(DC, LOGPIXELSY);
      Fontname := FlbArt.Items[FlbArt.ItemIndex];
      EnumFontFamilies(DC, PChar(Fontname), @EnumFontSizes, Longint(Self));
      OC := OnClick;
      OnClick := nil;
      ItemIndex := Items.IndexOf(Text);
      OnClick := OC;
      if Assigned(OnClick) then
        OnClick(Self);
    finally
      Items.EndUpdate;
      ReleaseDC(0, DC);
    end;
  end;
end;
  Mit Zitat antworten Zitat