Schriftgöße proportional zur Fenstergöße



  • @Eles

    Danke, funktioniert prima, allerdings war das mit der Mitte eher beispielhaft gemeint.
    Ich habe auch Texte , welche nicht mittig sind, wie muss ich da ran gehen, damit auch die Position korrigiert wird.

    Thx@all



  • Gleiches Schema

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    float KonLabel1Size=0.00;
    float KonLabel1Top=0.00;
    float KonLabel1Left=0.00;
    float KonLabel2Size=0.00;
    float KonLabel2Top=0.00;
    float KonLabel2Left=0.00;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
      KonLabel1Size=(float)Form1->Height/(float)Label1->Font->Size;
      KonLabel1Top=(float)Form1->ClientHeight/(float)Label1->Top;
      KonLabel1Left=(float)ClientWidth/(float)Label1->Left;
      KonLabel2Size=(float)Form1->Height/(float)Label2->Font->Size;
      KonLabel2Top=(float)Form1->ClientHeight/(float)Label2->Top;
      KonLabel2Left=(float)ClientWidth/(float)Label2->Left;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
      Label1->Font->Size=(float)Form1->Height/KonLabel1Size;
      Label1->Top=(float)Form1->ClientHeight/KonLabel1Top;
      Label1->Left=(float)ClientWidth/KonLabel1Left;
      Label2->Font->Size=(float)Form1->Height/KonLabel2Size;
      Label2->Top=(float)Form1->ClientHeight/KonLabel2Top;
      Label2->Left=(float)ClientWidth/KonLabel2Left;
    }
    //---------------------------------------------------------------------------
    

    Kann dann aber passieren das sich Felder schneiden, aber das kann man ja auch Abfangen.



  • @Eles

    Herzlichen Dank !!!

    Problem: Ich habe insgesamt 15 verschiedene Texte-muss ich das jetzt für jeden einzeln schreiben oder gibt es eine vereinfachte Methode die alle berücksichtigt?

    Problem: Wenn Darstellung nicht mehr proportional (4:3 -> 16:9) dann haut z.Bsp. die LEFT-Ausrichtung nicht mehr hin.

    Hast du noch ne Idee ?

    Thx@all



  • Das mit der Änderung der Auflösung hatte ich nicht bedacht, aber hier ein kleiner Ansatz es zu vereinfachen:

    Bei der Funktion SetSize(...) musst du halt noch die übrigen Komponenten hinzufügen wie z.B. TMemo.

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //Anzahl der Felder
    const CouFeld=3;
    //Konstante für Labels      {Size,Top ,Left}
    float KonLabel[CouFeld][3]={0.00,0.00,0.00};
    
    void SetKonsSize(int id,int Size,int Top,int Left){
      KonLabel[id][0]=(float)Form1->ClientHeight/(float)Size;
      KonLabel[id][1]=(float)Form1->ClientHeight/(float)Top;
      KonLabel[id][2]=(float)Form1->Width/(float)Left;
    };
    
    void SetSize(TObject *Sender,int id){
      try{
    	if(TLabel* Label = dynamic_cast<TLabel*>(Sender)){
    	  Label->Font->Size=(float)Form1->Height/KonLabel[id][0];
    	  Label->Top=(float)Form1->ClientHeight/KonLabel[id][1];
    	  Label->Left=(float)Form1->ClientWidth/KonLabel[id][2];
    	}else if(TEdit* Label = dynamic_cast<TEdit*>(Sender)){
    	  Label->Font->Size=(float)Form1->Height/KonLabel[id][0];
    	  Label->Top=(float)Form1->ClientHeight/KonLabel[id][1];
    	  Label->Left=(float)Form1->ClientWidth/KonLabel[id][2];
    	}//...
      }catch(...){
    	//
      }
    }
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
      SetKonsSize(0,Label1->Font->Size,Label1->Top,Label1->Left);
      SetKonsSize(1,Label2->Font->Size,Label2->Top,Label2->Left);
      SetKonsSize(2,Edit1->Font->Size,Edit1->Top,Edit1->Left);
      //...
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
      SetSize(Label1,0);
      SetSize(Label2,1);
      SetSize(Edit1,2);
      //...
    }
    //---------------------------------------------------------------------------
    


  • @Eles

    Danke !!!

    Kann es sein, ads die RezieFunktion schon beim öffnem des Formulars ausgeführt wird ?

    Ich habe mal ein bischen an den Zahlen rumgespielt und bemergt, das schon beim Aufruf des Forms die Werte geändert werden, obwohl das nur in der Rezise-Anweisung drin steht.

    Wenn dem so ist, wie kann ich das umgehen bzw. abstellen ?

    Thx@all



  • Natürlich. Schließlich wird beim Start das Fenster auf die vordefinierte Größe (welche du beim C++ Builder eingestellt hast) angepasst, damit man es überhaupt sieht.



  • @Eles

    Alles klar.

    Hast du noch eine Idee wegen der unterschiedliche Auflösung ?
    Ich hätte gedacht wenn das Fenster beispielsweise um 10Pix breiter wird muss ich die LEFT Position um 5pix erhöhen ???
    Funktioniert nicht richtig.

    Thx@all

    Danke, ich hab es über die Width-Option gemacht und Align=Center.



  • PROBLEM !!!

    Bis hierher ging alles prima, wenn ich jetzt jedoch mehr wie 7 Label einfüge bekomme ich immer eine Fehlermeldung:

    SetKonsSize(7,Label8->Font->Size,Label8->Top,Label8->Left,Label8->Width);

    ---------------------------
    Benachrichtigung über Debugger-Exception
    ---------------------------
    Im Projekt Turnier.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 0058466A in Modul 'Turnier.exe'. Schreiben von Adresse 4147F46A' aufgetreten.
    ---------------------------
    Anhalten Fortsetzen Hilfe
    ---------------------------

    Sobald ich diesen Eintrag lösche geht es wieder.
    Das Label selbst ist noch im Form und wird auch angezeigt.

    HelpPlease
    Thx@all



  • @Eles

    Hab gerade noch ein Problem festgestellt:
    Wenn ich das Fenster mehrmals hintereinander maximiere/verkleinere, dann rutschen die Positionen Top->nach oben Left->nach links um so ca. 5 oder 10PIX,
    d.h. nach etwa 10 mal groß/klein hat sich die anzeige um etwa 50PIX verschoben.

    Das Fenster hat keinen Rahmen und wird per Doppelclick maximiert/minimiert.

    Thx@all



  • Zu den Speicherfehler:
    Hast du die

    const CouFeld=3;
    

    auf die Anzahl deiner Felder erhöht?
    Also bei 9 Labels und 5 Edits muss die Zahl auf mindestens 14 stehen.

    Zu den Verschieben:
    Komisch es Funktioniert auch wenn ich es 100 mal maximiere und normalisiere, die Labels und Edits verschieben sich nicht, sondern kommen immer auf den vorgesehen platz.

    Vielleicht könntest du deinen Code mal zeigen um den Fehler nachvollziehen zu können.



  • @Eles

    Danke, ja das wars

    const CouFeld=3;
    

    ,
    Hab ich erhöt und jetzt funzt es.
    Jetzt scheint auch das mit der Verschiebung weg zu sein.

    THX!!!


Anmelden zum Antworten