Avatar billede skindbeni Nybegynder
03. december 2006 - 23:11 Der er 7 kommentarer og
2 løsninger

Udføre ens kode for samtlige Tedits

Jeg har endnu en, der liger denne.
http://www.eksperten.dk/spm/747414

Ven en forms onShow vil jeg gerne udføre det samme for hvert enkelt af mine TEdits

Kan der laves noget lignende ovenstående, således jeg ikke behøver lave samme kode til samtlige edits.
Avatar billede hrc Mester
04. december 2006 - 13:16 #1
Lav en enkelt event-procedure og fyld kode i den. Dernæst markerer du alle de andre TEdits (<skift> + mus). I Object Inspectoren vælges nu denne procedure i OnShow event-comboboksen. Det er det.

Hvis du kører D7 kan du i øvrigt rette navnet til noget mere sigende, eksempelvis kan du ændre eCPRShow til EditOnShow ved at rette det i comboboksen. I D2007 skal du "refactore" den.
Avatar billede skindbeni Nybegynder
09. december 2006 - 23:26 #2
Hej.

Beklager den sene respons.

Jeg ved ikke, om vi har talt forbi hinanden.

Jeg laver lige et simpelt eksempel:

Jeg har form2.

På form2 har jeg 10 stk. Tedit.

De 10 Tedit bokse henter deres indhold fra en Inifil. Det sker i procedure GetData, som hentes ved formens Onshow.

Herefter ønsker jeg at gøre noget ved indholdet af samtlige TEdit's.

fx
edit1.text:= edit1.text + ' %'

Men kan man lave en kode, der gennemløber alle formens TEdit's og sætter giver dem deres text-indhold + ' %'
Avatar billede kroning Nybegynder
10. december 2006 - 16:50 #3
Hvis der "kun" er 10 edits og du nok kender navnene på dem kan du så ikke bare lave en procedure hvori du angiver navnene på alle 10 edits som et array og så lave en for-next?
Avatar billede hrc Mester
11. december 2006 - 09:36 #4
Kroning: Hvis man vil lave "stabil" kode så er en af metoderne at fremtidssikre den. Her kunne SkindBeni enten lave en procedure der kan tage alle komponenterne som argument:

procedure TForm1.SetEdits(aEdits: array of TEdit);
var
  i : integer;
  Reg : TRegistry;
  Edit : TEdit;
begin
  Reg := TRegistry.Create;
  try
    for i := low(aEdits) to high(aEdits) do
      Edit.Text := '%';

    if Reg.OpenKeyReadOnly('Software\MySoftware\MyProg') then
    begin
      for i := low(aEdits) to high(aEdits) do
      begin
        Edit := aEdits[i];
        if Reg.ValueExists(Edit.Name) then
          Edit.Text := Reg.ReadString(Edit.Name) + '%';
      end;
    end;
  finally
    Reg.Free;
  end;
end;

SetEdits([Edit1, Edit2, Edit3 ... ]);

Alternativt kan han lave et gennemløb af komponenterne på siden. Ulempen er, at hvis man har Edits som man ikke skal arbejde med, så bliver man nødt til at sætte dens Tag eller lignende

procedure TForm1.ButtonClick(Sender: TObject);
var
  i : integer;
  Reg : TRegistry;
  Edit : TEdit;
  List : TObjectList;
begin
  // Først find komponenter og sæt deres default værdi
  List := TObjectList.Create(false); // False er ret vigtig her...
  try
    for i := 0 to self.ComponentCount - 1 do
      if (self.Components[i] is TEdit) then
      begin
        Edit := (self.Components[i] as TEdit);
        if Edit.Tag > 0 then
        begin
          List.Add(Edit);
          Edit.Text := '%';
        end;
      end;

    // Dernæst kig efter deres værdier i registreringsdatabasen
    Reg := TRegistry.Create;
    try
      if Reg.OpenKeyReadOnly('Software\MySoftware\MyProg') then
        for i := 0 to List.Count - 1 do
        begin
          Edit := List[i] as TEdit;
          if Reg.ValueExists(Edit.Name) then
            Edit.Text := Reg.ReadString(Edit.Name) + '%';
        end;
    finally
      Reg.Free;
    end;
  finally
    List.Free;
  end;
end;
Avatar billede kroning Nybegynder
11. december 2006 - 10:00 #5
Dit første forslag var også hvad jeg foreslog "en procedure hvori du angiver navnene på alle 10 edits som et array og så lave en for-next".
Men han skriver ini fil så hvorfor blander du regbasen ind i det?

procedure TForm1.SetEdits(aEdits: array of TEdit);
var
  i : integer;
begin
  for i := low(aEdits) to high(aEdits) do
    aEdits[i].Text:=aEdits[i].Text+'%';
end;

.
.

SetEdits([Edit1, Edit2, Edit3 ... ]);
Avatar billede hrc Mester
11. december 2006 - 11:09 #6
Kroning: OK, Nu skrev du bare "arrays" - ikke "dynamiske arrays" og så så jeg følgende foran mig (min fejl):

var
  ArgsArray : array[0..9] of TEdit - og det ville jo kun virke til en vis grad.

procedure xyz
var
  i : integer;
begin
  for i := 0 to 9 do
    if assigned(ArgsArray[i]) then
      ...
 
Jeg bruger registreringsdatabasen fordi jeg synes ini-filer er noget skrammel og et levn fra gamle dage. Hvis man skal gemme indstillinger i en separat fil, så bør man i det mindste gøre det i en xml-fil eller lignende nymodens. Det andet har et støvet grimt look, som hvis man hænger Wunderbaum i en ny bil eller installerer en latterlig stor udstødning (sidepipes ser kun godt ud på en Viper) på den. Det vil virke, men det sgu ikke smart ud.
De eksterne filer vil i øvrigt give problemer ved eksempelvis Cirtix mens det vil gå i registreringsdatabasen.

Jeg har set indlæg om, at MS selv er på vej væk fra RegDB, (den er også ved at blive ret stor) men tror dog, at modererer man mængden af data er det stadig den bedste metode at gemme indstillinger på.
Avatar billede hrc Mester
11. december 2006 - 11:11 #7
I øvrigt, arbejder man med databaser og bruger login så bør indstillingerne naturligvis gemmes i databasen så de følger brugerens login. Det er den bedste løsning der.
Avatar billede kroning Nybegynder
11. december 2006 - 15:29 #8
Tja, forskellige meninger :-), jeg bruger faktik ini filer til alle mine programmer da jeg syntes de er smartere at bruge end som reg.basen.
Avatar billede hrc Mester
12. december 2006 - 08:47 #9
kroning: Tænkte nok du var en ini-fil-korsridder... Du får problemer hvis dine programmer ender i et read/only miljø, eksempelvis terminal-løsninger.

Jeg er ikke blind for de største fordele:
1. Man kan rette i den med en teksteditor.
2. Filen kan kopieres fra maskine til maskine
3. Man kan inddele data i logiske grupper

... men egentlig kan alt dette også let klares vha. RegEdit og TRegistry. Den største ulempe med registreringsdatabasen er dens størrelse og dernæst hastigheden. Kan ikke tro andet end, at den må blive langsommere desto flere "hives" man smækker i den. Fandt lige et informativt link om Registry: http://www.windowsitlibrary.com/Content/224/3.html

Afsluttende: Der er ingen helt perfekt løsning - den med databasen er egentlig ret fin, hvis altså den er til rådighed - man må vælge den vej der løser ens opgave.
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