![]() |
AW: Formular Position speichern
Zitat:
In der Tat hatte ich gelegentlich Rückfragen von Kunden zu bearbeiten, die sich darüber beschwerten, daß ein Formular, das sie zur Anzeige gewählt hatten, nicht sichtbar sei. Ich habe dann natürlich jedesmal erklärt, daß das Formular nur deshalb nicht zu sehen sei, weil es sich außerhalb des Bildschirms befände und anschließend erläutert, wie man dieses Formular via Tastatur wieder in den sichtbaren Bereich herüberziehen kann. Diese Problematik hat sich mit deiner Hilfe nun endgültig erledigt :thumb: |
AW: Formular Position speichern
Zitat:
Ein Formular kann schon über den Bildschirmrand hinaus gehen... Man sollte testen ob die Titelleiste per Maus greifbar ist, damit der Kunde nicht die F10 usw... Tastaturbedienung zum Fensterverschieben lernen muss... Bedeutet bei "links raus" die Weite der minimize,maximize und close Schaltflächen abzuziehen... Es hat sich auch bewährt im Menue neben der Window-Liste einen Reset-Positionsaufruf ins Mainmenue zu übernehmen... |
AW: Formular Position speichern
Im Grunde sollte es genügen zu überprüfen, ob der Left-Wert größer ist als ScreenMax. Ist noch was vom Fenster zu sehen, kann der Anwender sich in der Regel selbst behelfen. Oder man prüft gleich in Einstellungen_Lesen, ob der Left-Wert plus Fensterbreite größer ist als ScreenMax und korrigiert dann sofort. Das werde ich demnächst mal genauer ausbaldowern müssen. Das Formular kann ja auch in Minusbereich des Screens (unsichtbar) "erscheinen", je nachdem, wie die Anordnung der verschiedenen Bildschirme zuvor aussah. Bei Releases hab ich immer darauf geachtet, daß die mitgelieferte Datenbank keine Formulare auf möglicherweise unsichtbaren Screens öffnet, indem ich die Positionen entweder von Hand in der DB geändert habe oder beim letzten Test vor dem Versenden die entsprechenden Formulare einfach richtig positionierte. Das ist natürlich umständlich, was sich mit deinem Vorschlag jetzt erledigt hat.
|
AW: Formular Position speichern
Hmmm..
Delphi-Quellcode:
Abspeichern geht dann analog.
Function TMyFormDataModule.LoadFormPos (Form : TForm);
Begin // Damit die Position nur 1x gesetzt wird. If Form.Tag=1 then Exit; Form.Tag := 1; FormPosition.Active := False; // FormPosition.SQL := 'select * from FormPositionen ' // +'where UserName = :UserName and FormName = :FormName'; FormPosition.Parameters.ParamByName['UserName'] := Self.TheUserName; FormPosition.Parameters.ParamByName['FormName'] := Form.Name; FormPosition.Open; If FormPosition.IsEmpty then Exit; Form.Left := FormPosition['Left']; Form.Top := FormPosition['Top']; Form.Width := FormPosition['Width']; Form.Height := FormPosition['Height']; DemandFormOnScreen(Form); // Stellt sicher, das das Formular sichtbar ist. End; In jedem Formular...
Delphi-Quellcode:
Getippt und nicht getestet, sollte aber so oder ähnlich laufen.
Procedure TMyForm.FormActivate(Sender : TObject);
Begin MyFormDataModule.LoadFormPos (Self); End; |
AW: Formular Position speichern
Zitat:
![]() ![]() SCNR :lol: |
AW: Formular Position speichern
Zitat:
Clean Code wäre eher etwas in dieser Richtung:
Delphi-Quellcode:
unit Services;
interface uses System.Classes; type IFormSettingsService = interface [ '{37C1665C-8C12-4430-9820-83D82DB76366}' ] function GetBlock( const BlockName: string; const ABlockData: TStream ): Boolean; function SetBlock( const BlockName: string; const ABlockData: TStream ): Boolean; end; implementation end.
Delphi-Quellcode:
unit Services.Impl;
interface uses System.Classes, Services; type TIniFormSettingsService = class( TInterfacedObject, IFormSettingsService ) private FFileName: string; FSection: string; public constructor Create( const AFileName, ASection: string ); function GetBlock( const BlockName: string; const ABlockData: TStream ): Boolean; function SetBlock( const BlockName: string; const ABlockData: TStream ): Boolean; end; implementation uses System.IniFiles; { TIniFormSettingsService } constructor TIniFormSettingsService.Create( const AFileName, ASection: string ); begin inherited Create; FFileName := AFileName; FSection := ASection; end; function TIniFormSettingsService.GetBlock( const BlockName: string; const ABlockData: TStream ): Boolean; var LIniFile: TIniFile; begin LIniFile := TIniFile.Create( FFileName ); try if LIniFile.SectionExists( FSection ) and LIniFile.ValueExists( FSection, BlockName ) then begin LIniFile.ReadBinaryStream( FSection, BlockName, ABlockData ); Result := True; end else Result := False; finally LIniFile.Free; end; end; function TIniFormSettingsService.SetBlock( const BlockName: string; const ABlockData: TStream ): Boolean; var LIniFile: TIniFile; begin LIniFile := TIniFile.Create( FFileName ); try ABlockData.Seek( 0, soFromBeginning ); LIniFile.WriteBinaryStream( FSection, BlockName, ABlockData ); Result := True; finally LIniFile.Free; end; end; end.
Delphi-Quellcode:
unit Configuration;
interface implementation uses FMX.Platform, Services, Services.Impl; initialization TPlatformServices.Current.AddPlatformService( IFormSettingsService, TIniFormSettingsService.Create( '.\foo.ini', 'forms' ) ); // ja, ja, das ist ein Unding mit dem relativen Pfad :o) end.
Delphi-Quellcode:
unit Form.BaseForm;
interface uses Services, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; type TBaseForm = class( TForm ) private FLoaded: Boolean; procedure InternalLoadSettings( Service: IFormSettingsService ); procedure InternalStoreSettings( Service: IFormSettingsService ); protected function GetBlockName: string; virtual; procedure DoClose( var Action: TCloseAction ); override; procedure DoShow; override; procedure DoLoadSettings( Settings: TBinaryReader ); virtual; procedure DoStoreSettings( Settings: TBinaryWriter ); virtual; public procedure LoadSettings; procedure StoreSettings; end; var BaseForm: TBaseForm; implementation {$R *.dfm} uses FMX.Platform; { TBaseForm } procedure TBaseForm.DoClose( var Action: TCloseAction ); var LService: IFormSettingsService; begin inherited; end; procedure TBaseForm.DoLoadSettings( Settings: TBinaryReader ); begin end; procedure TBaseForm.DoShow; begin if not FLoaded then LoadSettings; FLoaded := True; inherited; end; procedure TBaseForm.DoStoreSettings( Settings: TBinaryWriter ); begin end; function TBaseForm.GetBlockName: string; begin Result := Self.ClassName; end; procedure TBaseForm.InternalLoadSettings( Service: IFormSettingsService ); var LBlockData: TMemoryStream; LReader: TBinaryReader; begin LBlockData := TMemoryStream.Create; try if Service.GetBlock( GetBlockName, LBlockData ) then begin LBlockData.Seek( 0, soFromBeginning ); LReader := TBinaryReader.Create( LBlockData ); try DoLoadSettings( LReader ); finally LReader.Free; end; end; finally LBlockData.Free; end; end; procedure TBaseForm.InternalStoreSettings( Service: IFormSettingsService ); var LBlockData: TMemoryStream; LWriter: TBinaryWriter; begin LBlockData := TMemoryStream.Create; try LWriter := TBinaryWriter.Create( LBlockData ); try DoStoreSettings( LWriter ); finally LWriter.Free; end; LBlockData.Seek( 0, soFromBeginning ); Service.SetBlock( GetBlockName, LBlockData ); finally LBlockData.Free; end; end; procedure TBaseForm.LoadSettings; var LService: IFormSettingsService; begin if TPlatformServices.Current.SupportsPlatformService( IFormSettingsService, LService ) then InternalLoadSettings( LService ); end; procedure TBaseForm.StoreSettings; var LService: IFormSettingsService; begin if TPlatformServices.Current.SupportsPlatformService( IFormSettingsService, LService ) then InternalStoreSettings( LService ); end; end.
Delphi-Quellcode:
Aber so schön Clean das auch ist, es löst nicht das eigentliche Problem!
unit Form.MainForm;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Form.BaseForm, Vcl.StdCtrls; type TMainForm = class( TBaseForm ) Edit1: TEdit; private protected procedure DoLoadSettings( Settings: TBinaryReader ); override; procedure DoStoreSettings( Settings: TBinaryWriter ); override; public end; var MainForm: TMainForm; implementation {$R *.dfm} { TMainForm } procedure TMainForm.DoLoadSettings( Settings: TBinaryReader ); begin inherited; Top := Settings.ReadInteger; Left := Settings.ReadInteger; Height := Settings.ReadInteger; Width := Settings.ReadInteger; Edit1.Text := Settings.ReadString; end; procedure TMainForm.DoStoreSettings( Settings: TBinaryWriter ); begin inherited; Settings.Write( Top ); Settings.Write( Left ); Settings.Write( Height ); Settings.Write( Width ); Settings.Write( Edit1.Text ); end; end. Ein Anfang ist es aber schon mal ;) |
AW: Formular Position speichern
Rofl
|
AW: Formular Position speichern
Zitat:
![]() ![]() |
AW: Formular Position speichern
Zitat:
SCNRT |
AW: Formular Position speichern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz