Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schriftart,farbe usw. Projektweit festlegen (https://www.delphipraxis.net/92593-schriftart-farbe-usw-projektweit-festlegen.html)

wfs12 22. Mai 2007 23:44


Schriftart,farbe usw. Projektweit festlegen
 
Guten abend besteht irgendwie die Möglichkeit, dass man die Font Eigenschaften nicht nur für eine Form, sondern für alle Forms des Projektes auf einmal festlegen kann?

Hansa 22. Mai 2007 23:51

Re: Schriftart,farbe usw. Projektweit festlegen
 
Na klar geht das : stelle alles auf einer Musterform ein. Schiebe die in die Objektablage und sage nicht neu -> Form, sondern fische sie bei andere -> ?? raus.

WS1976 23. Mai 2007 04:59

Re: Schriftart,farbe usw. Projektweit festlegen
 
Hallo,

das ist aber eigentlich nur die halbe Antwort.
Wie mach ich das wenn schon "100" Forms existieren?

Grüsse

CCRDude 23. Mai 2007 08:10

Re: Schriftart,farbe usw. Projektweit festlegen
 
Zur Laufzeit oder zur Designzeit?

Schau mal in die Hilfe unter ControlCount/Controls. Iteriere alle Formen der Anwendung und dort alle Controls durch, damit sollte es zur Laufzeit geht. Zur Designzeit: such Dir nen guten Texteditor, der in mehreren Dateien parallel suchen&ersetzen kann, öffne alle .dfms im Textformat und ersetze sie dort.

hsg 23. Mai 2007 08:46

Re: Schriftart,farbe usw. Projektweit festlegen
 
Zitat:

Zitat von CCRDude
Zur Laufzeit oder zur Designzeit?

Schau mal in die Hilfe unter ControlCount/Controls. Iteriere alle Formen der Anwendung und dort alle Controls durch, damit sollte es zur Laufzeit geht. Zur Designzeit: such Dir nen guten Texteditor, der in mehreren Dateien parallel suchen&ersetzen kann, öffne alle .dfms im Textformat und ersetze sie dort.

Das geht natürlich nur, wenn die Werte vorher vom Standard abweichen, da sonst die Eigenschaften nicht in der DFM gespeichert sind.

Alternativ: Eine Ableitung von TForm erstellen, die gewünschten Werte dort einstellen (evtl. gleich mittels Registry oder INI auch von aussen einstellbar machen) und in allen Projektdateien mittels Global Search & Replace TForm durch deine neue Klasse ersetzen. Neue Fenster dann über die Methode von Hansa.

shmia 23. Mai 2007 09:06

Re: Schriftart,farbe usw. Projektweit festlegen
 
Das lässt sich über eine Form-Factory regeln.
Anstatt das Formular wie üblich direkt zu erzeugen wird folgende Procedure aufgerufen:
Delphi-Quellcode:
procedure GlobalCreateForm(InstanceClass: TComponentClass; var Reference);
var
  Instance: TComponent;
begin
  Instance := TComponent(InstanceClass.NewInstance);
  TComponent(Reference) := Instance;
  try
    Instance.Create(Application);
  except
    TComponent(Reference) := nil;
    raise;
  end;
  if Instance is TForm then
     with Instance as TForm do
     begin
        // Font zentral ändern
        // man sollte die Einstellung natürlich nicht hart codieren
        // sondern beim Progstart laden (z.B. aus INI-Datei)
        Font.Size := 12;
     end;
end;
Beispiel:
Delphi-Quellcode:
var
   frm : TMyForm;
begin
   GlobalCreateForm(TMyForm, frm); // statt Application.CreateForm()
   frm.ShowModal;
   ...

CCRDude 23. Mai 2007 09:08

Re: Schriftart,farbe usw. Projektweit festlegen
 
@hsg: Hmmm... also der Fontname der Form selber ist bei mir immer drin (zumindest wo ich gerade reingeschaut habe) - der von Controls natürlich nicht, aber da kommt ja ParentFont zur Geltung, sprich da muss nicht zwingend etwas ersetzt werden?
(wobei deine Methode natürlich eleganter ist, das geb ich zu :) )

@shmia: oh je, an der .dpr rumpfuschen, das mag die IDE aber eigentlich gar nicht ;)

hsg 23. Mai 2007 09:46

Re: Schriftart,farbe usw. Projektweit festlegen
 
Zitat:

Zitat von CCRDude
@hsg: Hmmm... also der Fontname der Form selber ist bei mir immer drin (zumindest wo ich gerade reingeschaut habe) - der von Controls natürlich nicht, aber da kommt ja ParentFont zur Geltung, sprich da muss nicht zwingend etwas ersetzt werden?
(wobei deine Methode natürlich eleganter ist, das geb ich zu :) )

@shmia: oh je, an der .dpr rumpfuschen, das mag die IDE aber eigentlich gar nicht ;)

Font.Size ist nicht enthalten (könnte man aber wohl über Font.Height setzen), okay, Zeichensatz mag wohl noch gehen, aber es gibt genug Properties die bei Default-Werten nicht in der DFM stehen und dann sitzt du mit deiner Lösung auf dem Schlauch :)

shmia will ja nicht unbedingt an der .dpr rumpfuschen, obwohl auch das geht. Man muss nur beachten, dass die Applikation am Schluss ein Hauptfenster hat, mit dem die VCL arbeiten kann (z.B. zum Bestimmen wie lange die MessagePump am Leben erhalten werden muss).
Alle weiteren Fenster sollte man sowieso nicht über den normalen Automatismus öffnen lassen, sondern es explizit an den geeigneten Stellen im Source-Code selber erledigen (und dort kann man dann anfangen zu streiten, ob man
Delphi-Quellcode:
Application.CreateForm(TMyForm,myFrm)
oder
Delphi-Quellcode:
 myForm := TMyForm.Create(self);
oder eben shmias Variante benutzt. Wobei diese Variante sich nur zur Laufzeit auswirkt. Braucht man das visuelle Feedback zur Designzeit (z.B. Anordnung von Controls bei Änderung der Schriftart und Größe) funktioniert die Form-Factory nicht.

Aber wie heisst es so schön: Alle Wege führen nach Rom (ich will aber nach Paris! :zwinker: )

Hansa 23. Mai 2007 11:51

Re: Schriftart,farbe usw. Projektweit festlegen
 
Zitat:

Zitat von WS1976
Wie mach ich das wenn schon "100" Forms existieren?

Wer zu spät kommt, den bestraft das Leben. :mrgreen:

Alle DFMs durchsuchen, ersetzen usw., müsste zwar schon gehen, aber ob dann nicht unliebsame Quereffekte auftreten ? :gruebel:

Die DFM sieht dann nicht so aus :

Delphi-Quellcode:
object TForm1: TForm
sondern die Objektablage produziert solche Forms :

Delphi-Quellcode:
inherited frm2: Tfrm
Manche sagen deshalb auch "benutze die Form-Inheritance". Setzt die genaue Planung zu spät ein, dann dürften die meisten Vorteile verloren gehen. Zusätzlich müsste nämlich dann noch in allen abgeleiteten Forms in diesem Falle noch das wohl vorhandene Font = entfernt werden, usw. Wäre wohl sehr mühselig. Da bleibt wohl wirklich nur Laufzeit übrig. Oder alles neu und dieses mal richtig machen. :zwinker: Meine Formulare haben fast alle immer einen Vorfahren, weil immer irgendwas dazukommt und sei es nur eine Checkbox. Da die Bedienung aber einheitlich sein soll sind Tastatur- und Mausereignisse allerdings schon sehr früh in der Form-Hierarchie eingebaut. Eigentlich schade, dass solche mächtigen Sachen von kaum einem benutzt werden. Wäre bei mir irgendein Font projektweit umzustellen, das wäre eine Sache von 1 Min. !

alzaimar 23. Mai 2007 12:43

Re: Schriftart,farbe usw. Projektweit festlegen
 
Hansa, man kann sich aber einen kleinen blöden Translator schreiben, der einfach in der DFM die 1.Zeile ändert, sowie in den korrespondierenden PAS-Dateien in die USES-Klausel den Modulnamen der 'Vater-Form' sowie in die Deklaration der Form die Abhängigkeit von der Vaterform ablegen.

Ich hab das schon oft gemacht.

shmia 23. Mai 2007 12:45

Re: Schriftart,farbe usw. Projektweit festlegen
 
Eigentlich sollte die Klasse TScreen das Event AfterFormCreate und AfterDataModuleCreate haben.
Dann könnte man ohne Probleme zur Laufzeit Änderungen an allen Formularen vornehmen.
Man könnte so z.B. das SystemMenu aller Formulare um die Menupunkt Print erweitern, Code zum Übersetzen von Texten ausführen oder Skins laden.
Das geht dann schon in Richtung Aspektorientierte Programmierung. Leider hat Delphi (Win32) da nicht so viel zu bieten.

Hansa 23. Mai 2007 18:34

Re: Schriftart,farbe usw. Projektweit festlegen
 
Zitat:

Zitat von alzaimar
Hansa, man kann sich aber einen kleinen blöden Translator schreiben, der einfach in der DFM die 1.Zeile ändert, sowie in den korrespondierenden PAS-Dateien in die USES-Klausel den Modulnamen der 'Vater-Form' sowie in die Deklaration der Form die Abhängigkeit von der Vaterform ablegen.

Ich hab das schon oft gemacht.

In Ausnahmefällen ich auch, allerdings dann eher von Hand, wegen Geringfügigkeit. Bei 100 Forms würde das auch anders aussehen. Schlechte Planung lässt sich eben schwer ausbügeln. Man muss bedenken, was alles zusammenhängt. DFM <-> PAS und die DPR usw. Da muss alles passen. So etwas in größerem Stil zu simulieren oder nachzubauen ??

Sind das wirklich 100 Formulare ? Dann tendiere ich mittlerweile dazu, das tatsächlich komplett neu zu machen. Ist das eine einmalige Sache, dann vielleicht nicht.

Hansa 23. Mai 2007 19:13

Re: Schriftart,farbe usw. Projektweit festlegen
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von alzaimar
Hansa, man kann sich aber einen kleinen blöden Translator schreiben, der einfach in der DFM die 1.Zeile ändert, sowie in den korrespondierenden PAS-Dateien in die USES-Klausel den Modulnamen der 'Vater-Form' sowie in die Deklaration der Form die Abhängigkeit von der Vaterform ablegen.

Ich hab das schon oft gemacht.

In Ausnahmefällen ich auch, allerdings dann eher von Hand, wegen Geringfügigkeit. Bei 100 Forms würde das auch anders aussehen. Schlechte Planung lässt sich eben schwer ausbügeln. Man muss bedenken, was alles zusammenhängt. DFM <-> PAS und die DPR usw. Da muss alles passen. So etwas in größerem Stil zu simulieren oder nachzubauen ??

Sind das wirklich 100 Formulare ? Dann tendiere ich mittlerweile dazu, das tatsächlich komplett neu zu machen. Ist das eine einmalige Sache, dann vielleicht nicht.

Nachtrag :

Soeben hierdrüber gestolpert :

Zitat:

Zitat von Thomas Steinmaurer im Entwicklerforum
Was ich Dir auf jeden Fall ans Herz legen würde ist, dass mit "Form-Inheritance" arbeitest. Im Klartext bedeutet das, dass Du Dir "Basisformulare" entwirfst, die bereits so viel wie möglich an Logik enthält, und die speziellen Listen/Eingabe-Formulare dann von diesen "Basisformularen" abgeleitet sind. Somit erben diese Formulare alles was in den Basisformularen bereits implentiert wurde. D.h. hiermit kommt man sehr rasch zu Ergebnissen, und man muss nicht immer wieder alles von Grund auf neu machen.

Der schreibt da auch "Form-Inheritance". Es ist die Objektablage bzw. auf englisch : "Repository". Worum es konkret geht ist dabei egal. Der Sinn allerdings nicht !

wfs12 23. Mai 2007 19:59

Re: Schriftart,farbe usw. Projektweit festlegen
 
Also ich, der die Anfangsfrage gestellt hat, hab nur 7 Forms und wollte, wenn ich eine Einstellung ändere nicht font.size und was da noch so alles bei ist für jede Form ändern. So wies aber aussieht lohnt sich der Aufwand alles auf einmal zu machen nicht bei so wenigen Forms. --> Also alles selber einzeln schreiben oder?!

DGL-luke 23. Mai 2007 20:04

Re: Schriftart,farbe usw. Projektweit festlegen
 
DFM-Parser gibts schon. Die meisten glaube ich read-only. Hab hier einen im Einsatz, der mir sprachrelevante properties aus dfms fischt und in XML packt. :)

Hansa 23. Mai 2007 20:35

Re: Schriftart,farbe usw. Projektweit festlegen
 
Zitat:

Zitat von wfs12
..der die Anfangsfrage gestellt hat, hab nur 7 Forms und wollte...So wies aber aussieht lohnt sich der Aufwand alles auf einmal zu machen nicht bei so wenigen Forms. --> Also alles selber einzeln schreiben oder?!

Sofern das nur einmalige Sache ist (Hausaufgabe und dann Tschüss Delphi usw.), dann stelle es von Hand um. Besteht die Möglichkeit, dass irgendwann mal statt 7 auch 70 Forms oder mehr benötigt werden, dann würde ich Dir dringend raten, das Konzept der Objektablage und somit OOP genauer unter die Lupe zu nehmen und anhand der 7 Forms das Programm dementsprechend umzubauen. Öffne in diesem Fall eine Form und nehme eine neue aus dem Repository (vererbt / inherited auswählen). Ab dann gehts los. Schneide die Komponenten aus der alten Form aus und füge sie in die abgeleitete ein, bis die alte Form leer ist. Dann diese auch aus dem Projekt entfernen. Ist auch nicht die Welt und fertig. Ab dann braucht Font, Schriftfarbe und auch Events etc. immer nur in der Ursprungs-Form abgeändert zu werden und das ist selbst für 7000 Forms auf einmal erledigt !


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