AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente für einen erweiterten Fontdialog?

Ein Thema von Athris · begonnen am 4. Sep 2017 · letzter Beitrag vom 6. Sep 2017
Antwort Antwort
Athris

Registriert seit: 18. Nov 2014
28 Beiträge
 
Delphi XE2 Professional
 
#1

Komponente für einen erweiterten Fontdialog?

  Alt 4. Sep 2017, 22:23
Hallo!

Ich bastle gerade an einer kleinen Bildbearbeitungssoftware, welche dynamisch auf Bildern Texte platziert. Diese Texte lassen sich mittels TFontDialog bereits etwas in Farbe, Schriftart und Schriftstil anpassen.

Nun meine Frage: Kennt jemand eine Komponente / Möglichkeit diesen TFontDialog zu erweitern?

Mir fehlt unter anderem:
-Benutzerdefinierte Farben (ich weiß das es dafür diese Colorpicker Komponente gibt. Leider müsste ich dann beides separat ansteuern)
-Textausrichtung (Links, rechts, zentriert)
-Ggf. noch Texteffekte (wobei das am unwichtigsten ist)

Es wäre traumhaft wenn es eine Möglichkeit gibt dies alles in einem "Button" zu vereinen.


Falls dies der falsche Forumbereich ist, bitte ich um Entschuldigung und verschieben des Threads. Vielen Dank!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Komponente für einen erweiterten Fontdialog?

  Alt 4. Sep 2017, 23:55
Das einfachste wäre wohl ein eigenes Formular dafür zu basteln.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
4. Sep 2017, 23:55
Dieses Thema wurde am "04. Sep 2017, 23:55 Uhr" von "Luckie" aus dem Forum "Die Delphi-IDE" in das Forum "GUI-Design mit VCL / FireMonkey / Common Controls" verschoben.
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Komponente für einen erweiterten Fontdialog?

  Alt 5. Sep 2017, 07:39
Dafür wären die Ribbons ideal. Dann braucht man keinen umständlichen Dialog, sondern kann die Werte direkt on the fly ändern. Das geht um Größenordnungen angenehmer und schneller. (Das sieht man ja am neuen Paint in Windows 10 und an Word usw.)

Ansonsten bleibt wirklich nur ein eigener Dialog.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Athris

Registriert seit: 18. Nov 2014
28 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Komponente für einen erweiterten Fontdialog?

  Alt 5. Sep 2017, 12:04
Ich habe bereits befürchtet das es auf einen eigenen Dialog hinausläuft.

Dann kann ich diesen immerhin nach meinen eigenen Wünschen gestalten


Ich hätte noch eine kurze Frage zu der Charset Property des TFont Objekts. So wie ich das gelesen habe kann ein TFontName mehrere Charsets haben. Diese würde ich dem Benutzer auch gerne anbieten wollen, in Form einer Combobox. Ich habe aber keinerlei Methode gefunden mit der ich grob gesagt sagen kann:
Hole alle Charsets der ausgewählten Schriftart und packe diese in meine Combobox.

Hat da jemand von euch eine Idee?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Komponente für einen erweiterten Fontdialog?

  Alt 5. Sep 2017, 13:18
Dafür gibt es EnumFontFamiliesEx:
https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.081 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Komponente für einen erweiterten Fontdialog?

  Alt 5. Sep 2017, 16:09
-Textausrichtung (Links, rechts, zentriert)
Absatz und Zeichen wird ja in der Regel deutlich getrennt.

Ich hätte noch eine kurze Frage zu der Charset Property des TFont Objekts. So wie ich das gelesen habe kann ein TFontName mehrere Charsets haben.
Hat das heutzutage/bei Unicode irgendeine Bewandnis?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Athris

Registriert seit: 18. Nov 2014
28 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Komponente für einen erweiterten Fontdialog?

  Alt 5. Sep 2017, 16:54
Zitat:
Hat das heutzutage/bei Unicode irgendeine Bewandnis?
Das ist die Frage. Ich nutze Delphi XE2 zurzeit.

Ich kann das Charset natürlich auch komplett weg lassen. Ich weiß nicht was dies für Konsequenzen hätte.
  Mit Zitat antworten Zitat
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Komponente für einen erweiterten Fontdialog?

  Alt 6. Sep 2017, 15:13
Du könntest den Fontdialog erweitern. Ich habe das mal für den Opendialog gemacht, siehe Anhang. Weiß allerdigs nicht, ob das beim Fontdialog auch so geht.
Delphi-Quellcode:
UNIT DataDlg;

 INTERFACE

  USES SysUtils,
       Windows,
       Messages,
       Classes,Controls,StdCtrls,Dialogs,Graphics,
       ExtCtrls,ExtDlgs,Buttons;

  TYPE
   TLoadDataDlg = CLASS(TOpenDialog)
                   PRIVATE
                    FPreviewPanel: TPanel;
                     FPreviewMemo: TMemo;

                    PROCEDURE DoOnTypeChange(sender:TObject);

                   PROTECTED
                    PROCEDURE DoClose; OVERRIDE;
                    PROCEDURE DoSelectionChange; OVERRIDE;
                    PROCEDURE DoShow; OVERRIDE;

                    PROCEDURE PreviewKeyPress(sender:TObject; VAR key:Char);

                   PUBLIC
                    CONSTRUCTOR Create(a_owner:TComponent); OVERRIDE;
                    DESTRUCTOR Destroy; OVERRIDE;

                    FUNCTION Execute:Boolean; OVERRIDE;

                    CLASS FUNCTION LoadData(parent:TComponent; file_exts:TStringList; VAR test_file:TFileName):Boolean;
                  END;

 IMPLEMENTATION

  USES StrUtils,
       Consts,
       Forms,CommDlg,Dlgs,
       LalrGlob,MyIOUtils,AppMsg;

// Pascal file ( *.pas) | *.pas | Any file ( *.*) | *.*

  PROCEDURE TLoadDataDlg.DoOnTypeChange(sender:TObject);
   VAR
    dlg_filter: String;
     file_name: TFileName;
             i: Integer;
             j: Integer;
             k: Integer;

   CONST
    cb_Filename_Id = 1148;

   BEGIN
    file_name := '*.*';
    dlg_filter := Filter + ' |';
    j := 2*FilterIndex - 1;
    k := 0;
    FOR i:=1 TO Length(dlg_filter)
     DO IF dlg_filter[i] = '|'
         THEN BEGIN
               Inc(k);
               IF k = j
                THEN BEGIN
                      j := i + 1;
                      FOR k:=j TO Length(dlg_filter)
                       DO IF dlg_filter[k] = '|'
                           THEN BEGIN
                                 file_name := Trim(Copy(dlg_filter,j,k-j-1));
                                 Break
                                END;
                      Break
                     END
              END;
    SendMessage(GetParent(Handle),cdm_SetControlText,Edt1,Integer(PChar(file_name)));
    SendMessage(GetDlgItem(GetParent(Handle),idOk),bm_Click,0,0)
   END; {OF PROCEDURE TLoadDataDlg.DoOnTypeChange}

  CONSTRUCTOR TLoadDataDlg.Create(a_owner:TComponent);
   BEGIN
    INHERITED Create(a_owner);
    OnTypeChange := DoOnTypeChange;
    FPreviewPanel := TPanel.Create(Self);
    WITH FPreviewPanel
     DO BEGIN
         Name := 'PreviewPanel';
         Caption := '';
         SetBounds(200,10,250,200);
         BevelOuter := bvNone;
         BevelWidth := 1;
         TabOrder := 1;
         FPreviewMemo := TMemo.Create(Self);
         WITH FPreviewMemo
          DO BEGIN
              Parent := FPreviewPanel;
              Font.Name := 'Courier New';
              Font.Size := 8;
              ReadOnly := True;
              ScrollBars := ssBoth;
              WordWrap := False;
              SetBounds(0,0,250,200);
              Align := alClient
            END
        END
    END; {OF CONSTRUCTOR TLoadDataDlg.Create}

  DESTRUCTOR TLoadDataDlg.Destroy;
   BEGIN
    FPreviewMemo.Free;
    FPreviewPanel.Free;
    INHERITED Destroy
   END; {OF DESTRUCTOR TLoadDataDlg.Destroy}

  PROCEDURE TLoadDataDlg.DoSelectionChange;
   FUNCTION ValidFile(CONST FileName:String):Boolean;
    BEGIN
     Result := GetFileAttributes(PChar(FileName)) <> $FFFFFFFF
    END; {OF FUNCTION ValidFile}

   VAR
      tmp_data: TStringList;
     full_name: String;
    valid_file: Boolean;

   BEGIN
    full_name := FileName;
    valid_file := FileExists(full_name) and ValidFile(full_name);
    IF valid_file = True
     THEN BEGIN
           tmp_data := TStringList.Create;
           TRY
            TRY
             tmp_data.LoadFromFile(full_name);
             FPreviewMemo.Lines.Assign(tmp_data);
            EXCEPT
             valid_file := False
            END
           FINALLY
            tmp_data.Free
           END
          END;
    IF valid_file = False
     THEN BEGIN
          END;
    FPreviewMemo.Invalidate;
    INHERITED DoSelectionChange
   END; {OF PROCEDURE TLoadDataDlg.DoSelectionChange}

  PROCEDURE TLoadDataDlg.DoClose;
   BEGIN
    INHERITED DoClose;
    Application.HideHint
   END; {OF PROCEDURE TLoadDataDlg.DoClose}

  PROCEDURE TLoadDataDlg.DoShow;
   VAR
    prev_rect: TRect;
    stat_rect: TRect;

   BEGIN
    GetClientRect(Handle,prev_rect);
    stat_rect := GetStaticRect;
    prev_rect.Left := stat_rect.Left + (stat_rect.Right - stat_rect.Left);
    Inc(prev_rect.Top,4);
    FPreviewPanel.BoundsRect := prev_rect;
    FPreviewPanel.ParentWindow := Handle;
    INHERITED DoShow
   END; {OF PROCEDURE TLoadDataDlg.DoShow}

  PROCEDURE TLoadDataDlg.PreviewKeyPress(sender:TObject; VAR key:Char);
   BEGIN
    IF Key = #27
     THEN TForm(sender).Close
   END; {OF PROCEDURE TLoadDataDlg.PreviewKeyPress}

  FUNCTION TLoadDataDlg.Execute:Boolean;
   BEGIN
    IF NewStyleControls = True
     THEN Template := 'DLGTEMPLATE'
     ELSE Template := NIL;
    Result := INHERITED Execute
   END; {OF FUNCTION TLoadDataDlg.Execute}

  CLASS FUNCTION TLoadDataDlg.LoadData(parent:TComponent; file_exts:TStringList; VAR test_file:TFileName):Boolean;
   VAR
    data_dlg: TLoadDataDlg;
    data_ext: String;
     cur_ext: String;

   BEGIN
    data_ext := BuildFileFilter(file_exts);
    data_dlg := TLoadDataDlg.Create(parent);
    TRY
     WITH data_dlg
      DO BEGIN
         Title := TextOf('LoadTestData');
         InitialDir := ExtractFilePath(test_file);
         IF Length(ExtractFileExt(test_file)) = 0
          THEN cur_ext := FirstFilterExt(data_ext)
          ELSE BEGIN
                cur_ext := '*' + ExtractFileExt(test_file);
                IF GetFilterIndexOf(cur_ext,data_ext) = Undefined
                 THEN cur_ext := FirstFilterExt(data_ext)
               END;
         DefaultExt := DefaultFilterExt(cur_ext);
         FileName := cur_ext;
         Filter := data_ext;
         FilterIndex := GetFilterIndexOf(cur_ext,data_ext);
         Options := [ofHideReadOnly,ofFileMustExist,ofEnableSizing];
         IF Execute = True
          THEN BEGIN
                Result := True;
                test_file := FileName
               END
          ELSE Result := False
         END;
    FINALLY
     data_dlg.Free
    END
   END; {OF CLASS FUNCTION TLoadDataDlg.LoadData}

 END
.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
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