Avatar billede anold Nybegynder
07. november 2000 - 08:24 Der er 26 kommentarer og
1 løsning

Gemme label placering

Hvem kan vise mig hvordan jeg henter og gemmer flere labels properties i f.eks en tekst fil, således at når jeg starter programmet op igen så har label\' den samme placering på formen som da jeg lukkede programmet
De labels jeg ønsker at gemme er nogle som jeg opretter dynamisk med

fLabel := Tlabel.Create(Form1);
fLabel.Parent := Form1;
fLabel := Tlabel.Create(Form1);
fLabel.Parent := Form1;
fLabel.Top := Form1.Top+2 ;
fLabel.left := Form1.Left+2;
fLabel.Caption := \'oprettet \';
fLabel.Color := clred;
fLabel.Transparent := False;
fLabel.DragMode:=dmmanual;
fLabel.OnMouseDown :=Form1.LabelMouseDown;
fLabel.OnMouseMove := Form1.LabelMouseMove;
fLabel.OnMouseup := Form1.LabelMouseUp;
fLabel.Visible:= True;

Avatar billede pellelil Nybegynder
07. november 2000 - 08:28 #1
Hvis du er down så brug RxLib. De har et komponent der netop er til det formål. Du vælge hvilke componenter og hvilke af disses properties der skal gemmes. Dernæst tager \"TFormStorage\" sig af resten.

RxLib\'s samling kan hentes fra: http://www.rxlib.com
Avatar billede delphi Nybegynder
07. november 2000 - 08:29 #2
Hej Anders - jeg lever endnu!

Jeg ville umiddelbart vælge at gemme sådanne informationer
i en INI fil (alternativt i reg DB\'en).

Eksempel følger.

Peter
Avatar billede pellelil Nybegynder
07. november 2000 - 08:29 #3
<LOL> \"down\" er åbenbart Jydsk for \"doven\" eller også skal jeg bare ha\' lidt mere kaffe :-)
Avatar billede hatecaps Nybegynder
07. november 2000 - 08:31 #4
Du kan bruge ini-filer til dette. Kig i on-line hjælpen under tinifile, med den kan du læse og skrive meget nemt og hurtigt til/fra en tekstbaseret fil. Ini filer har én stor fordel frem for at bruge registreringsdatabasen, (hvilket ville være en anden mulighed), nemlig at du ikke behøver administrator rettigheder for at skrive i den.

ha\' det godt
hatecaps :-)
Avatar billede pellelil Nybegynder
07. november 2000 - 08:37 #5
For god ordens skyld så vil jeg lige sige at RxLib\'s TFormStorage både kan bruge IniFiler og Registrerings databasen (dog ikke på samme tid <G>). Foruden at gemme dine forms componenter/properties kan du også \"huske\" hvilket component der var aktiv sidst du brugte formen, samt formens placering (således behøver brugerne ikke flytte deres forms til deres \"favorit-position\" hver gang programmet åbnes).

Hatecaps> For god ordens skyld så skal brugeren som minimum have skrive rettighed på disken for at kunne gemme INI-filen. Der hvor jeg ser fordelen i INI filer det er hvis disse er tilgængelige for alle brugere (evt. i form af en INI fil der ligger på et netværks drev). Således kan man sikre at alle køre med samme opsætning ,dog falder dette til jorden hvis de skulle kunne gemme i den - es wird doch hat-und-brillen (Jydsk for: \"det gør op i hat og briller\").
Avatar billede delphi Nybegynder
07. november 2000 - 08:50 #6
Nedenstående er et eksempel:  På en tom form opretter du tre knapper og placerer 6 labels (eller hvormange du nu vil - programmet finder selv ud af det).  To af knapperne er bundet op til at henholdsvis at gemme og loade label positionerne.  Den sidste knad flytter dine labels lidt tilfældigt rundt, således at du kan se at gemme/loade funktionerne virker.

Here goes:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,
  IniFiles;  // Husk at \"use\" den her!

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    buSave: TButton;
    buLoad: TButton;
    buMove: TButton;
    procedure buSaveClick(Sender: TObject);
    procedure buLoadClick(Sender: TObject);
    procedure buMoveClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

Const
  IniFileName = \'C:\\Temp\\LabelTest.Ini\';

procedure TForm1.buSaveClick(Sender: TObject);
Var
  Index  : Integer;
  IniFile : TIniFile;
  aLabel  : TLabel;
begin
  IniFile := TIniFile.Create(IniFileName);

  For Index := 0 To Form1.ComponentCount-1 Do
    If Form1.Components[Index] is TLabel Then
      Begin
        aLabel := Form1.Components[Index] As TLabel;

        IniFile.WriteInteger(\'LABEL POS\', aLabel.Name+\'_TOP\', aLabel.Top);
        IniFile.WriteInteger(\'LABEL POS\', aLabel.Name+\'_LEFT\', aLabel.Left);
      End;

  IniFile.Free;
end;

procedure TForm1.buLoadClick(Sender: TObject);
Var
  Index  : Integer;
  IniFile : TIniFile;
  aLabel  : TLabel;
begin
  IniFile := TIniFile.Create(IniFileName);

  For Index := 0 To Form1.ComponentCount-1 Do
    If Form1.Components[Index] is TLabel Then
      Begin
        aLabel := Form1.Components[Index] As TLabel;

        aLabel.Top  := IniFile.ReadInteger(\'LABEL POS\', aLabel.Name+\'_TOP\', 0);
        aLabel.Left := IniFile.ReadInteger(\'LABEL POS\', aLabel.Name+\'_LEFT\', 0);
      End;

  IniFile.Free;
end;

procedure TForm1.buMoveClick(Sender: TObject);
Var
  Index  : Integer;
  aLabel  : TLabel;
begin
  For Index := 0 To Form1.ComponentCount-1 Do
    If Form1.Components[Index] is TLabel Then
      Begin
        aLabel := Form1.Components[Index] As TLabel;

        aLabel.Top  := Random(Form1.Height);
        aLabel.Left := Random(Form1.Width);
      End;
end;

end.


Delphi
Avatar billede delphi Nybegynder
07. november 2000 - 08:52 #7
Jeg kommer lige til at tænke på:  Load funktione kan se\'følig udbygges til at oprette dine labels dynamisk mens du loader deres positioner.  Finder du selv ud af det eller hur?

Delphi
Avatar billede anold Nybegynder
07. november 2000 - 09:11 #8
Hej Delphi
Går det godt i dit nye Job ??

Jeg må nok sige at jeg savner dig til at løse alle mine Delphi fejl men hvad så må vi jo mødes her på eksperten

Det vile være fint hvis DU kunne lave det dynamisk
men ini filen skulle også gerne gemme properties for Color og Caption

Hilsen Anold 
Avatar billede picard Nybegynder
07. november 2000 - 09:17 #9
Jeg vil foreslå at informationerne skrives i REG, der netop blev introduceret til selvsamme formål.

se spg.

http://www.eksperten.dk/spm/29291

for mere information om hvordan man skriver til reg.
Avatar billede delphi Nybegynder
07. november 2000 - 09:17 #10
jo da.  svar følger lidt senere.... arbejder lige nu (træls at den slags også er nødvendigt!)

NiP
Avatar billede delphi Nybegynder
07. november 2000 - 09:23 #11
Picard: Det er rigtigt at Reg databasen i princippet blev oprettet med det formål, MEN det er bare ærgerligt at der er så fandens mange installationer rundt omkring, hvor administratorene i sikkerhedens hellige navn (sporer i min sarkasme?) har lukket for adgangen til Reg DB\'en når man skal bare en lille smule ned i niveau.  Sådan er/var det blandt andet på Danfoss hvor Anold arbejder (og jeg gjorde indtil for 14 dage siden) - og det er givetvis der hvor Anolds program skal anvendes (eller sider du og fusker Anders!?)
En helt anden ting er at INI fil formatet stadig understøttes af Windows, er nemt at læse for \"almindelige mennesker\" med NotaPad og at det er en bedre løsning i forbindelse med distribuerede programmer over netværk.  Jeg har fx. benyttet formatet i forbindelse med dataopsamling, hvor nogle data skulle sendes via en server.

Delphi
Avatar billede anold Nybegynder
07. november 2000 - 09:30 #12
Hej Delphi
Det skuffer mig dybt i mit gode hjerte at du kan få den tanke at jeg skulle fuske i arbejdstiden.

Nå men jeg må jo se og få bygget min stolthed op igen.

Delphi, det dom jeg sidder og roder med er en del af det planlægnings system som jeg var ved at lave da du rejste ud i det virkelige liv, bøv
mit lille problem her er opstået fordi at jeg gerne vil kunne vise belastningen i et form for Gant-kort

Avatar billede delphi Nybegynder
08. november 2000 - 09:08 #13
Bøv selv...  Jeg har ikke lige haft tid til at lave det eksempel jeg lovede dig 3-4 indslag længere oppe... men med lidt held fikser jeg det idag.

Peter
Avatar billede delphi Nybegynder
09. november 2000 - 09:45 #14
u har jeg lige taget mig lidt sammen og lavet eksemplet færdigt.  Her kommer først formens DFM fil som text:

object Form1: TForm1
  Left = 314
  Top = 126
  Width = 528
  Height = 451
  Caption = \'Form1\'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = \'MS Sans Serif\'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object buSave: TButton
    Left = 304
    Top = 16
    Width = 75
    Height = 25
    Caption = \'&Save\'
    TabOrder = 0
    OnClick = buSaveClick
  end
  object buLoad: TButton
    Left = 392
    Top = 16
    Width = 75
    Height = 25
    Caption = \'&Load\'
    TabOrder = 1
    OnClick = buLoadClick
  end
  object buRandom: TButton
    Left = 200
    Top = 16
    Width = 75
    Height = 25
    Caption = \'&Randomize\'
    TabOrder = 2
    OnClick = buRandomClick
  end
  object seNoLabels: TSpinEdit
    Left = 112
    Top = 16
    Width = 49
    Height = 22
    MaxValue = 0
    MinValue = 0
    TabOrder = 3
    Value = 10
  end
  object stNoLabels: TStaticText
    Left = 40
    Top = 19
    Width = 63
    Height = 17
    Caption = \'No of labels:\'
    TabOrder = 4
  end
end

Herefter kommer kildekoden til den tilhørende unit.

unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,
  IniFiles, Spin;  // Husk at \"use\" den her!

type
  TForm1 = class(TForm)
    buSave: TButton;
    buLoad: TButton;
    buRandom: TButton;
    seNoLabels: TSpinEdit;
    stNoLabels: TStaticText;
    procedure buSaveClick(Sender: TObject);
    procedure buLoadClick(Sender: TObject);
    procedure buRandomClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

Const
  IniFileName = \'C:\\Temp\\LabelTest.Ini\';

procedure TForm1.buSaveClick(Sender: TObject);
Var
  Index  : Integer;
  IniFile : TIniFile;
  aLabel  : TLabel;
  Count  : Integer;
begin
  Count  := 0;
  IniFile := TIniFile.Create(IniFileName);
  Try

    For Index := 0 To Form1.ComponentCount-1 Do
      If Form1.Components[Index] is TLabel Then
        Begin
          Inc(Count);
          aLabel := Form1.Components[Index] As TLabel;

          IniFile.WriteInteger(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_TOP\', aLabel.Top);
          IniFile.WriteInteger(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_LEFT\', aLabel.Left);
        End;

    IniFile.WriteInteger(\'LABEL NO\', \'NoOfLabels\', Count);
  Finally
    IniFile.Free;
  End;
end;

procedure TForm1.buLoadClick(Sender: TObject);
Var
  Index    : Integer;
  IniFile  : TIniFile;
  aLabel    : TLabel;
  Count    : Integer;
begin
  // Først slettes alle eksisterende labels på formen.
  For Index := ComponentCount-1 DownTo 0 Do
    If Components[Index] Is TLabel Then
      Components[Index].Free;

  // Opret Inifile object.
  IniFile := TIniFile.Create(IniFileName);
  Try
    // Læs hvor mange labels der er gemt i filen.
    Count := IniFile.ReadInteger(\'LABEL NO\', \'NoOfLabels\', 0);
    // Sæt spinediten\'s value til antallet af labels.
    seNoLabels.Value := Count;

    // Opret det ønskede antal labels dynamisk.
    For Index := 1 To Count Do
      Begin
        aLabel := Tlabel.Create(Form1);
        aLabel.Parent := Form1;
        aLabel.Name := \'Label\'+IntToStr(Index);
        aLabel.Top  := IniFile.ReadInteger(\'LABEL POS\', \'LABEL\'+
                                          IntToStr(Index)+\'_TOP\', 0);
        aLabel.Left := IniFile.ReadInteger(\'LABEL POS\', \'LABEL\'+
                                          IntToStr(Index)+\'_LEFT\', 0);
        aLabel.Caption := aLabel.Name;
        aLabel.Visible:= True;
      End;

  Finally
    IniFile.Free;
  End;

end;

procedure TForm1.buRandomClick(Sender: TObject);
Var
  Index  : Integer;
  aLabel  : TLabel;
begin
  // Først slettes alle eksisterende labels på formen.
  For Index := ComponentCount-1 DownTo 0 Do
    If Components[Index] Is TLabel Then
      Components[Index].Free;

  // Derefter oprettet dynamisk et antal specificeret i SpinEdit controlen.
  For Index := 1 To seNoLabels.Value Do
      Begin
        aLabel := Tlabel.Create(Form1);
        aLabel.Parent := Form1;
        aLabel.Name := \'Label\'+IntToStr(Index);
        aLabel.Top  := Random(Form1.Height - 100) + 50;
        aLabel.Left := Random(Form1.Width - 60);
        aLabel.Caption := aLabel.Name;
        aLabel.Visible:= True;
      End;
end;

end.


Håber det kan bruges

Delphi
Avatar billede anold Nybegynder
09. november 2000 - 14:23 #15
Hej Delphi

På grund af en helt urimligt højt arbejdes-byrde har jeg først nu fået tid til at teste dit EKS,
der er et eller andet som ikke virker for det er som om at der ikke bliver oprettet nogle labels dynamisk, hvis man kigger i INI filen så står der
[LABEL NO]
NoOfLabels=0

kan du få tid til at se på hvad der er galt !!

Hilsen anold.
Avatar billede delphi Nybegynder
09. november 2000 - 15:44 #16
Er du nu ikke lidt vanskelig!  Hvis du skulle brokke dig over urimeligt høje arbejdsbyrder hver gang Vinge, Ebber eller en tilfældig anden peson skulle bede dig om noget som helst, så vill evi vel aldrig få fred.... bøv.. :)

Programmet virker altså ganske fint hos mig og jeg har lavet det i Delphi 5.  Bruger du også den eller D4?  Det burde altså også virke i D4! 
Måske er det i virkeligheden bare dig der er lidt defekt i dine (tastatur)bevægelser?

Peter
Avatar billede delphi Nybegynder
09. november 2000 - 15:48 #17
Jeg har lige lavet en gang klippe klister direkte ind i en sprit ny D5 application - og bortset fra at uniten i ovenstående eksempel kaldes MainForm mod D5\'s default Unit1, så compiler og kører skidtet fuldstendig upåklageligt.

Anders, der er ikke andet for, end at du må få smurt smøreolien af dine små fedtede finge og prøve igen.

Peter
Avatar billede anold Nybegynder
10. november 2000 - 07:31 #18
Hej Delphi
For hver label jeg opretter dynamisk vil jeg  gerne gemme dens (Top,Left,Width)og dens Color, samt dens tekst (Caption) som jeg indtaster via en inputbox.
Tror du at du kan hjælpe mig med det
Hilsen anold
Avatar billede delphi Nybegynder
10. november 2000 - 09:54 #19
Skrig - du bliver da bare ved, hva\'?

Indrømmer du nu, at eksemplet virker?  - Ned på gulvet og kravl for din master! :)

Nu til det mere seriøse:

Du kan gemme lige hvad du vil i din INI fil. 

Start med buSaveClickmetoden:

Linierne:
    IniFile.WriteInteger(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_TOP\', aLabel.Top);
    IniFile.WriteInteger(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_LEFT\', aLabel.Left);

udvider du fx. med: 

    IniFile.WriteInteger(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_WIDTH\', aLabel.Width);
    IniFile.WriteString(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_CAPTION\', aLabel.Caption);
    IniFile.WriteString(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_COLOR\', ColorToString(aLabel.Color));

Som du kan se er det ikke noget problem at gemme andre typer end Integers - nogen skal/bør dog ændres til string - se fx. ovenstående Color convertering.
Slå TIniFile op i online hjælpen for at se yderligere metoder.

Når du skal ha\' indlæst dine værdier skal du selvsagt udvide din buLoadClick lidt. 

Efter linien:

    aLabel.Top  := IniFile.ReadInteger(\'LABEL POS\', \'LABEL\'+IntToStr(Index)+\'_TOP\', 0);

Indsættes:

    aLabel.Width  := IniFile.ReadInteger(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_WIDTH\', 40);
    aLabel.Caption := IniFile.ReadString(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_CAPTION\', aLabel.Name);
    aLabel.Color  := StringToColor(IniFile.ReadString(\'LABEL POS\', \'LABEL\'+IntToStr(Count)+\'_COLOR\', clBtnFace));

Håber det hjælper:

Delphi

PS: Ovenstående er rystet ud af højre ærme uden at være afprøvet - en parameter eller to kan være sat forkert.
Avatar billede anold Nybegynder
10. november 2000 - 11:50 #20
Hej Delphi
Hil dig du store master !!

Nej jeg indrømmer intet(det gør jeg nu aldrig)
når jeg trykker på buSave og kigger i INI filen så er NoOfLabels=0, men hvis jeg laver en procedure der hedder :
 
procedure TForm1.BuopretClick(Sender: TObject);
var
aLabel  : TLabel;
begin
  aLabel := Tlabel.Create(Form1);
  aLabel.Parent := Form1;
  aLabel := Tlabel.Create(Form1);
  aLabel.Parent := Form1;
  aLabel.Top  := Random(Form1.Height - 100) + 50;
  aLabel.Left := Random(Form1.Width - 60);
  aLabel.Caption := aLabel.Name;
  aLabel.Color := Random(Color);
  aLabel.Visible:= True;
end;

så opretter den EN label som jeg kan se, når jeg så gemmer den bliver der gemt \'\' 2 \'\' label\'s i INI filen, selv om jeg kun har oprettet EN, når jeg så vælger BuLoad så kommer begge label\'s frem, hvoraf den som jeg ikke kan \"se\" bliver gemt i Top := ,Left := 0.
Kan du forklare det??

Hilsen Din ukulige slave anold
Avatar billede anold Nybegynder
10. november 2000 - 12:00 #21
Hej Delphi (Master)

I min BuLoad har jeg sat de linjer ind du har lavet men jeg får en fejl i denne linje :

aLabel.Color  := StringToColor(IniFile.ReadString(\'LABEL POS\', \'LABEL\'+                                      IntToStr(Count)+\'_COLOR\', clBtnFace));



Fejlen er : [Error] Unit1.pas(123): Incompatible types: \'String\' and \'Integer\'

Hvad er der mon galt
Hilsen anold
Avatar billede delphi Nybegynder
10. november 2000 - 12:00 #22
Du er en fusker.  Send mig hele dit program på np@tagarno.dk så kigger jeg lige på det.

Delphi
Avatar billede delphi Nybegynder
10. november 2000 - 13:31 #23
Dit problem ligger givetvis i dette stk kode fra det du sendte mig:

procedure TForm1.BuopretClick(Sender: TObject);
var
aLabel  : TLabel;
begin
  aLabel        := Tlabel.Create(Form1);
  aLabel.Parent  := Form1;
  aLabel        := Tlabel.Create(Form1);
  aLabel.Parent  := Form1;


Bemærk at du opretter 2 labels - den første bliver oprettet uden at du sætter nogle af dens properties (ud over Owner og Parent).  Den vil derfor blive placeret i position 0,0 med en tom caption\'en.

Når du loader den vil den derfor blive vist en label i venstre hjørne.

Delphi
Avatar billede anold Nybegynder
10. november 2000 - 13:43 #24
Hej Delphi

Ok Det er guds straf til dem der er så doven at de kopiere alt hvad de kan

har du fundet en løsning på min fejlmeddelse??
Hilsen ham med de røde øere
Avatar billede delphi Nybegynder
10. november 2000 - 14:00 #25
Ja, det er fordi der lige mangler nogle dylpher omkring clBtnFace, dvs. der skal stå \'clBtnFace\'.

God weekend, øllen kalder.

Peter
Avatar billede anold Nybegynder
10. november 2000 - 14:01 #26
Hil dig du store mester
må du nyde dit øl

Hilsen anold
Avatar billede delphi Nybegynder
10. november 2000 - 14:04 #27
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester