13. november 2010 - 15:19 Der er 11 kommentarer og
1 løsning

DYNAMISK LISTE

HEJ

DETTE ER EB IDE, JEGN HAR TÆNKT PÅ LÆNGE- VED IKKE OM DET ER MULIGT:

Du har en Delphi-form med et antal LABELS, et antal EDITS, et antal LISTBOXe osv.....

Hver enkelt Enhed (label, Edit, Listbox) har et navn, som er unikt for denne enhed (typisk enhed + et nummer). Til F.eks labels og Edit's er der ofte et tekstfelt (hhv. Caption og Text).

Du kan sætte dis Captions og text-felter dynamisk under program-kontrol eller sætte dem initialt med Object Inspector'en.

Min ide er om denne OBject Inspector "kunne erstattes af en INITIALAZATION rutine", som henter komponentens type (edit. labels etc) og erstatter CAPTIOn- OG/elelr TEXT-feltet med en dynamisk værdi hentet fra en initialiseringsfil (XML-typen).

jeg havde tænkt mig noget i stim med følgende (PSEUDOKODE):

TEKST-LISTE

COMPONENT:    TEXT/CAPTION
LABEL1 :      testtekst 1
Label2 :      Testtekst 2 

Edit1          Edit1Tekst
Edit2          Edit2Tekst   

OSV..

For N := 0 to ANTAL-KOMPOENTER Do
  BEGIN
      FIND_KOMPONENT_TYPE;
      Skift Komponent-TEkstfelt til aktuelle Tekst; (* Text / CAPTION *)
      Set evt. andre attributter på valgte komponent; (* XM-bestemt *)
  END,

Fordelen vil være, at ved forskellige sprog-versioner kan jeg bare installere/vælge den pågældende INI-DK.XML, INI-US.XML, INI-SE.XML (osv) og så vil XML-parseren selv finde komponenten, finde ud af typen (her: caption / text), sææte CAPTION/ TEXT, sætte andre attributter (inkl. i XML-filen) og når den er færdig har jeg en hhv. DANSK, USA'sk (undskyld for denne), SVENSk eller NORSK (eller andre) udgave kørende. Programmet er jo ligeglad med labels-indholdet..     

Ved at lægge alt tekst i en XML-fil er det nemmere at rette og håndtere (for mig - ihvertfald).

Kristian
Avatar billede mortvader Nybegynder
13. november 2010 - 15:29 #1
Du kan godt oprette komponenterne dynamisk, hvis det er det du mener:

//eksempel:

with Tedit do begin
  create(form1);
  parent:=form1;
  left:=10;
  top:=10;
  caption:='Test';
end;
13. november 2010 - 17:07 #2
HEJ,

Tak for svaret:

Nej, det er ikke den metode jeg ønsker at bruge- den kendte jeg.

Men mere i form af :

FORM1.Component[0].XXXXXXX1.XXXXXXX2.Caption := 'min testtekst';

hvor Form1.Component[0] er en TLabel.

Jeg henter komponentens navn  og Type med følgende:

  CN := Form1.Components[0].Name;  (* Cn = string)
  CT := Form1.Components[0].ClassType; 

  ShowMessage('Class-type: ' + CT.ClassName );
  ShowMessage('Component-navn: ' + CN);


Men det jeg egentlig søger er syntaksen for denne linie:

--> for LABEL1 -->

FORM1.Component[0].XXXXXXX1.XXXXXXX2.Caption := 'min testtekst';

( xx-xx2 er sandsynligvis TLabel2 -- (men jeg er ikke sikker ...)

altså ændre XX-XX1 og XX-XX2 til nogen Delphi kan håndtere for Label1.

(Jeg ved jeg kan gøre det nemt med

Label1.Caption := 'min testtekst'); 

Men det skal KUNNE gøres dynamisk via Component[N] .... . 

KR
Avatar billede martinlind Nybegynder
13. november 2010 - 17:07 #3
Du kunne prøve at tage et kig på din DFM fil, hvis du sidder i Delphi kan du høreklike og vælge ViewAsText, så har du din "xml" af din form, dette kan du også lave selv i din kode.

Mht. flere sprog, understøtter delphi også det i de nyere versioner.
Avatar billede martinlind Nybegynder
13. november 2010 - 17:10 #4
og kig lidt på Stream.writecomponent() og binarytotext og texttobinary :-)
Avatar billede mortvader Nybegynder
13. november 2010 - 17:18 #5
Måske er det noget i den her stil du søger?

for x:=0 to form1.componentcount-1 do
  if form1.components[x] is Tedit then
    if (form1.components[x] as Tedit).name='edit1' then
      (form1.components[x] as Tedit).caption:='nådada';
13. november 2010 - 18:37 #6
HEJ,

Svar til mortvader lassen.me

JEP, der var den. Fungerer perfekt. Drop et svar og du får TAK og POINT.

(Det var metoden jeg søgte - resten af koden laver jeg selv. Tak for den . =

KR

PS: Er nok ikke mere på EKsperten i aften. Du får din kredit OG point i morgen..

KR
Avatar billede mortvader Nybegynder
13. november 2010 - 18:45 #7
Hyg dig med at kode :)
Avatar billede hrc Mester
13. november 2010 - 21:42 #8
Jeg har løst det på en anden måde. Når programmet kompileres med det rigtige flag (det er længe siden), så genereres der en fil med alle tekster. Filen indeholdt bl.a. alle tekster m. ID og den del blev linket ind i programmet.

Når programmet blev start, så blev en sprogtabel (en kolonne pr. sprog) opdateret så den indeholdt alle teksterne (og de records der ikke blev opdateret, blev slettet).

Derefter, stadig i programstart, blev sprogvalget hentet fra konfigurationen og i den del som loadede teksterne blev de erstattet med teksten fra den rette sprogkolonne. Jeg kan desværre ikke længere huske hvor vi hackede starten.

Jeg havde så en lille dialog hvor man kunne oversætte alle teksterne til de sprog der var kolonner til i sprogtabellen.

Hvis du er interesseret skal jeg gerne dykke ned i arkiverne og finde compilerflaget og den snip kode vi hackede programmet med.

... alternativt kan du lave alt tekst til resourcestrings og bruge Delphis indbyggede oversætter.

I øvrigt så tror jeg både din oprindelige løsning og den du går i gang med nu, er alt andet end anbefalelsesværdig. Hver dialog skal sættes op og vedligeholdes, og det bliver noget værre noget.
Avatar billede psycosoft-funware Nybegynder
14. november 2010 - 11:06 #9
havde det ikke været lige så nemt med GNU GetText?
http://dxgettext.po.dk/

Jeg har brugt det i længere tid og det har fungeret upårklageligt og er understøttet på bla linux og windows.

just my 2 cents :)
Avatar billede hrc Mester
15. november 2010 - 07:01 #10
psykoSoft: Jo, og Jedi har også komponenter til det. Det er måske løsningen at installere en par (!) Jedi-komponenter eller det du foreslår.
15. november 2010 - 11:00 #11
TIL HRC:  Ja- tak, må du meget gerne.

Til psycosoft-funware: 

Har set på EXE-filen - ser godt ud. Men det med SOURCEN har jeg lidt problemer med . HJÆLP ??

Mit project har pt. 10 (muligvis maximeres til ca. 15 (18?) )  forme med tilhørende labels, edits, croupboxes, osv. osv.  Ville det være "økonomisk" bedre at bruge GNU DXGettext ?

Min oprindelige ide var at lade hver forms INITIALIZATION rutine klare initialiseringen via XML ini-filen (inidk.xml - inise.xml osv) men det er endnu ikkr halt fastlagt.

KR
23. december 2011 - 11:40 #12
lukker
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