Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Font.Style ins Clientdataset Laden (https://www.delphipraxis.net/177948-font-style-ins-clientdataset-laden.html)

Natcree 7. Dez 2013 16:32

Font.Style ins Clientdataset Laden
 
Hallo Habe eine Datenbank mit nem Clientdataset und ner Datasource und möchte nun von einem TButton die Eigenschaft Font.style in die DB laden.

Delphi-Quellcode:
clientdataset1.FieldByName('Fontstyle').AsBoolean:= Schaltflaeche.Font.Style;
Das und alles andere habe ich versucht. Ich kriegs einfach nicht hin.

Hat jemand ne lösung???

Bernhard Geyer 7. Dez 2013 16:42

AW: Font.Style ins Clientdataset Laden
 
ein FontStyle ist ja auch kein Boolean.

Was du machen kannst ist den String zu speichern den auch die IDE dir anzeigt (also das [fsBold ...])

Gugst du mal diesen Thread ob nicht das dabei ist was du benötigst.

Natcree 7. Dez 2013 16:47

AW: Font.Style ins Clientdataset Laden
 
Ich habe es auch mit .asstring versucht aber dort kann ich dann nach Schaltflaeche.font. <-- kein style einfügen.

Perlsau 7. Dez 2013 17:42

AW: Font.Style ins Clientdataset Laden
 
Zitat:

Zitat von Natcree (Beitrag 1238873)
Hallo Habe eine Datenbank mit nem Clientdataset und ner Datasource und möchte nun von einem TButton die Eigenschaft Font.style in die DB laden.

Du mußt für jeden der möglichen Styles ein Boolean-Feld anlegen. Ich hab hier mal ein Beispiel, wie man den Style eines selektierten Textes in einem RichEdit in die Checked-Properties eines PopUp-Menüs überträgt:
Delphi-Quellcode:
procedure TFormMain.Popup_RichEdPopup(Sender: TObject);
begin
     IF DBRichEd_Inhalt.SelAttributes.Style = [] THEN
     BEGIN
          PuP_Red_Normal.Checked := TRUE;
          PuP_Red_Fett.Checked  := FALSE;
          PuP_Red_Kursiv.Checked := FALSE;
          PuP_Red_ULine.Checked := FALSE;
     END;
     IF DBRichEd_Inhalt.SelAttributes.Style = [fsBold] THEN
     BEGIN
          PuP_Red_Normal.Checked := FALSE;
          PuP_Red_Fett.Checked  := TRUE;
          PuP_Red_Kursiv.Checked := FALSE;
          PuP_Red_ULine.Checked := FALSE;
     END;
     IF DBRichEd_Inhalt.SelAttributes.Style = [fsItalic] THEN
     BEGIN
          PuP_Red_Normal.Checked := FALSE;
          PuP_Red_Fett.Checked  := FALSE;
          PuP_Red_Kursiv.Checked := TRUE;
          PuP_Red_ULine.Checked := FALSE;
     END;
     IF DBRichEd_Inhalt.SelAttributes.Style = [fsUnderline] THEN
     BEGIN
          PuP_Red_Normal.Checked := FALSE;
          PuP_Red_Fett.Checked  := FALSE;
          PuP_Red_Kursiv.Checked := FALSE;
          PuP_Red_ULine.Checked := TRUE;
     END;
     IF DBRichEd_Inhalt.SelAttributes.Style = [fsBold,fsItalic] THEN
     BEGIN
          PuP_Red_Normal.Checked := FALSE;
          PuP_Red_Fett.Checked  := TRUE;
          PuP_Red_Kursiv.Checked := TRUE;
          PuP_Red_ULine.Checked := FALSE;
     END;
     IF DBRichEd_Inhalt.SelAttributes.Style = [fsBold,fsUnderline] THEN
     BEGIN
          PuP_Red_Normal.Checked := FALSE;
          PuP_Red_Fett.Checked  := FALSE;
          PuP_Red_Kursiv.Checked := FALSE;
          PuP_Red_ULine.Checked := TRUE;
     END;
     IF DBRichEd_Inhalt.SelAttributes.Style = [fsItalic,fsUnderline] THEN
     BEGIN
          PuP_Red_Normal.Checked := FALSE;
          PuP_Red_Fett.Checked  := FALSE;
          PuP_Red_Kursiv.Checked := TRUE;
          PuP_Red_ULine.Checked := TRUE;
     END;
     IF DBRichEd_Inhalt.SelAttributes.Style = [fsBold,fsItalic,fsUnderline] THEN
     BEGIN
          PuP_Red_Normal.Checked := FALSE;
          PuP_Red_Fett.Checked  := TRUE;
          PuP_Red_Kursiv.Checked := TRUE;
          PuP_Red_ULine.Checked := TRUE;
     END;
end;
Falls du nicht gleich verstehst, was ich hier mache: Ich hab ein PopUpMenü, das verschiedene Einträge für Schriftstyles enthält: Normal, Fett, Kursiv, ULine. Diese Einträge können nun einen Haken haben (checked) oder auch nicht. Analog dazu kannst du dir deine Boolean-Felder in der Tabelle vorstellen. Das Normal-Feld kannst du natürlich weglassen, das definiert sich ja schon dadurch, daß eines der anderen Felder True ist. Alles klar?

Sir Rufo 7. Dez 2013 19:34

AW: Font.Style ins Clientdataset Laden
 
Da Delphi-Referenz durchsuchenTFontStyle ein Set ist, kann man so ein Set als string (z.B. "[fsBold,fsItalic]") darstellen (Funktionen gibt es dafür in beide Richtungen).

Am einfachsten ist es aber - weil es ein Set ist - den Wert in einen Integer zu überführen.

Delphi-Quellcode:
var
  FontStyleAsInt : integer;
begin
  // in einen Integer
  FontStyleAsInt := Integer( MyFont.Style );
  // und wieder zurück
  Integer( MyFontStyle ) := FontStyleAsInt;
end;
Schon brauchen wir uns nicht mehr fragen, wie bekommen wir den TFontStyle in die Datenbank, sondern einen Integer-Wert.

@Perlsau

Wenn ich das machen sollte, dann würde mir spontan das hier einfallen
Delphi-Quellcode:
begin
  PuP_Red_Normal.Checked := ( DBRichEd_Inhalt.SelAttributes.Style = [] );
  PuP_Red_Fett.Checked := ( fsBold in DBRichEd_Inhalt.SelAttributes.Style );
  PuP_Red_Kursiv.Checked := ( fsItalic in DBRichEd_Inhalt.SelAttributes.Style );
  PuP_Red_ULine.Checked := ( fsUnderline in DBRichEd_Inhalt.SelAttributes.Style );
end;

himitsu 7. Dez 2013 19:56

AW: Font.Style ins Clientdataset Laden
 
Man kann sich das Set auch via RTTI in einen String konvertieren lassen.

Perlsau 7. Dez 2013 20:24

AW: Font.Style ins Clientdataset Laden
 
Zitat:

Zitat von Sir Rufo (Beitrag 1238885)
@Perlsau

Wenn ich das machen sollte, dann würde mir spontan das hier einfallen
Delphi-Quellcode:
begin
  PuP_Red_Normal.Checked := ( DBRichEd_Inhalt.SelAttributes.Style = [] );
  PuP_Red_Fett.Checked := ( fsBold in DBRichEd_Inhalt.SelAttributes.Style );
  PuP_Red_Kursiv.Checked := ( fsItalic in DBRichEd_Inhalt.SelAttributes.Style );
  PuP_Red_ULine.Checked := ( fsUnderline in DBRichEd_Inhalt.SelAttributes.Style );
end;

Hab Dank, Sir Rufo, das ist unbestreitbar eleganter. Würde ich heute auch so machen. Der gepostete Code war aus einem älteren Projekt.

himitsu 7. Dez 2013 21:09

AW: Font.Style ins Clientdataset Laden
 
Nur das Normal würde ich besser weglassen, daß es eine "nutzlose" doppelte Information ist.


Nicht nur nutzlos, sondern glatt wiedersprüchlich, denn was ist, wenn Normal mal True ist und irgendeines der Anderen Felder auch?

Natcree 7. Dez 2013 21:43

AW: Font.Style ins Clientdataset Laden
 
Also habe gerade das Popupmenu erstellt aber er ändert den Haken nich von normal auf Kursiv oder fett.

Perlsau 7. Dez 2013 21:43

AW: Font.Style ins Clientdataset Laden
 
Zitat:

Zitat von himitsu (Beitrag 1238898)
Nur das Normal würde ich besser weglassen, daß es eine "nutzlose" doppelte Information ist.

Mein lieber Himitsu, das steht doch bereits in meinem Posting, wenn du noch mal nachlesen möchtest:
"Das Normal-Feld kannst du natürlich weglassen, das definiert sich ja schon dadurch, daß eines der anderen Felder True ist."

Natürlich wird das Normal zum Abspeichern in der DB nicht benötigt. Da ich jedoch ein Popupmenü beschrieben habe, das den Style eines selektieren Textes wiedergeben soll, gehörte dort das Normal dazu. Oder mit anderen Worten: Am späten Abend neigt man häufig zum Drüberlesen, so daß einem wichtige Details entgehen können.

Zitat:

Zitat von Natcree (Beitrag 1238902)
Also habe gerade das Popupmenu erstellt aber er ändert den Haken nich von normal auf Kursiv oder fett.

Mein lieber Natcree, du hattest doch vor, die Style-Eigenschaften eines (oder vielleicht auch mehrerer) Buttons in der Datenbank abzulegen und nicht die Style-Eigenschaften eines selektierten Textes in einem PopUp-Menü abzubilden. Wozu hast du dir denn jetzt ein PopUp-Menü erstellt und was hast du versucht, um dort eingetragene Style-Eigenschaften mit Checked-Haken zu versehen bzw. diese zu entfernen?

Natcree 7. Dez 2013 22:05

AW: Font.Style ins Clientdataset Laden
 
Weiss ich auch nicht hmmm ????

Habe mal das Versucht
Delphi-Quellcode:
FontStyleAsInt := integer(Schaltflaeche.Font.Style);
Zeigt mir aber invalid typcast an

Perlsau 7. Dez 2013 22:19

AW: Font.Style ins Clientdataset Laden
 
Ich geb's auf ... :(

Natcree 7. Dez 2013 22:28

AW: Font.Style ins Clientdataset Laden
 
nein Bitte nicht....


Über diesen schnipsel lade ich einen Button aus der DB

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
clientdataset1.LoadFromFile('C:\Delphi Progs\Menü 2\schaltflaeche.xml');
    clientdataset1.First;
    repeat
    Schaltflaeche                := TButton.Create(Form1);
    Schaltflaeche.Name:= clientdataset1.FieldValues['name'];
    Schaltflaeche.Caption:= clientdataset1.FieldValues['Caption'];
    Schaltflaeche.top:= clientdataset1.FieldValues['top'];
    Schaltflaeche.Left := clientdataset1.FieldValues['left'];
    Schaltflaeche.Width := clientdataset1.FieldValues['Width'];
    Schaltflaeche.Font.Style     := integer(Schaltflaeche.Font.Style);//Hier sagt er invalid Typcast
    Schaltflaeche.parent         := Self;
    Schaltflaeche.PopupMenu      := popupmenu1;
    Schaltflaeche.OnContextPopup := SchaltflaecheContextPopup;
    Schaltflaeche.OnMouseDown    := SchaltflaecheMouseDown;
    Schaltflaeche.OnMouseMove    := SchaltflaecheMouseMove;
    Schaltflaeche.OnMouseup      := SchaltflaecheMouseup;
    Clientdataset1.Next;
    until CLientdataset1.Eof;
    Umbenennen := nil;
end;

Und dann will ich wärend der Laufzeit Buttons erstellen und speicher sie in die DB
hiermit

Delphi-Quellcode:
procedure TForm1.SchaltflaecheHinzufuegen1Click(Sender: TObject);

begin
    Schaltflaeche               := TButton.Create(Form1);
    Schaltflaeche.Name          := 'Schaltflaeche'+inttostr(clientdataset1.RecordCount+1);
    Schaltflaeche.Caption       := Schaltflaeche.name;
    Schaltflaeche.Parent        := Self;
    Schaltflaeche.Top           := 50;
    Schaltflaeche.Width         := 100;
    Schaltflaeche.Left          := 50;
    Schaltflaeche.Font.Style    :=[fsbold];
    Schaltflaeche.PopupMenu     := PopupMenu1;
    Schaltflaeche.OnContextPopup := SchaltflaecheContextPopup;
    Schaltflaeche.OnMouseDown   := SchaltflaecheMouseDown;
    Schaltflaeche.onMouseMove   := SchaltflaecheMouseMove;
    Schaltflaeche.onMouseUp     := SchaltflaecheMouseUp;
    clientdataset1.Insert;
    Clientdataset1.FieldByName('name').AsString:= Schaltflaeche.name;
    clientdataset1.FieldByName('Caption').AsString:=Schaltflaeche.Caption;
    clientdataset1.FieldByName('top').AsInteger:= Schaltflaeche.top;
    clientdataset1.FieldByName('left').AsInteger:= Schaltflaeche.Left ;
    clientdataset1.FieldByName('width').AsInteger:= Schaltflaeche.width ;
    clientdataset1.FieldByName('Height').AsInteger:= Schaltflaeche.Height ;
    clientdataset1.FieldByName('Fontname').AsString:= Schaltflaeche.font.Name ;
    clientdataset1.FieldByName('Fontsize').AsInteger:= Schaltflaeche.Font.Size ;
    clientdataset1.FieldByName('Fontstyle').AsInteger:=//???
    Clientdataset1.post;
end;

himitsu 7. Dez 2013 22:50

AW: Font.Style ins Clientdataset Laden
 
Zitat:

Zitat von Natcree (Beitrag 1238909)
Habe mal das Versucht
Delphi-Quellcode:
FontStyleAsInt := integer(Schaltflaeche.Font.Style);
Zeigt mir aber invalid typcast an

Wie lautet denn die genaue Fehlermeldung?

Nja, entweder man nimmt Ord, daß vom Compiler in seiner größe angepasst wird, oder du mußt einen Integer.Typ nehmen, der genau so groß ist, in Bytes, wie der umzuwandelnde Typ.

Natcree 7. Dez 2013 22:58

AW: Font.Style ins Clientdataset Laden
 
Schaltflaeche Hinzufuegen.click wird dann während der Laufzeit ausgeführt. Es wird ein TButton erstellt und anschliessend diese daten in eine xml abgespeichert. Nunmehr kann mann später diese button über xml laden und auch wenn nötig bearbeiten.

Mousedown und move....... sind die Proceduren die der Button dann ausführen kann.

Wie gesagt er zeigt mir in der genannten reihe invalid typcast an.

Natcree 8. Dez 2013 00:01

AW: Font.Style ins Clientdataset Laden
 
So Ich denke ich Habe Jetzt eine Lösung Gefunden

Zum laden aus der XML

Geht der Code

Delphi-Quellcode:
var
  FontWertAusXml: Byte;
  FontStyle: TFontStyles;
begin
 FontWertAusXml := StrToInt(clientdataset1.FieldByName('Fontstyle').Asstring);
 Move(FontWertAusXml, FontStyle, SizeOf(FontStyle));
 Schaltflaeche.Font.Style := FontStyle;
end;

Zum Speichern in die XML

Geht der Code

Delphi-Quellcode:
var
 FontWertInXml: Byte;
 FontStyle: TFontStyles;
begin
 FontStyle := Schaltflaeche.Font.Style;
 Move(FontStyle, FontWertInXml, SizeOf(FontWertInXML));
 Clientdataset1.FieldByName('Fontstyle').Asstring:= IntToStr(FontWertInXml);
end;
Der Tip mit den Bytes war Supi wieder etwas dazugelernt.

Ihr Seid die Besten

:-D:-D:-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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