07. november 2000 - 08:24Der 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
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.
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.
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\").
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!
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;
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?
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.
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
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;
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
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?
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.
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
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.
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 :
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??
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.
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.