Hej Hans.
Nåeh .. du opdagede nok, at det var noget, jeg lige klaskede sammen.
Jeg vil ikke love dig, jeg er særlig pædagogisk, men jeg prøver at svare så
godt jeg kan.
"Hans Larsen" <Nospam> wrote:
>> Der er lige en uhensigtsmæssighed med blanke. Den fremgår af linie 4453 i
>> classes.pas (Delphi 7):
>> ...........
>> while (P^ > ' ') and (P^ <> Delimiter) do
>> ...........
>
> Den herover fangede jeg ikke lige.
Jeg mente blanke *tegn*, det må være mit keyboard, der er i stykker - igen.
Forklaring:
Nu ved jeg ikke hvilken Delphi version, du har, og/eller om du har adgang
til sourcen.
Det problem, jeg hentyder til er netop problemstillingen med (Som du også
har observeret), at den fortolker blank som tekstadskiller(?). Nu skrev jeg
uhensigtsmæssighed, men jeg vil mene, det er en fejl.
>> Men here i goes:
>> ******** Testfil**********
>> Kolonne 1;Kolonne 2;Kolonne 3;Kolonne 4
>> 1.Valg;1.Valg-f1;1.Valg-f2;1.Valg-f3
>> 2.Valg;2.Valg-f1;2.Valg-f2;2.Valg-f3
>> 3.Valg;3.Valg;3.Valg;3.Valg
>> 4.Valg;4.Valg;4.Valg;4.Valg
>> 5.Valg;5.Valg;5.Valg;5.Valg
>> ***********************
>
> Der er en "fejl" i det, som du har lavet. (ved godt, at det er noget, som
> du har strikket sammen hurtigt, men kan jo lige så godt få det rettet
)
>
> Når jeg laver test programmet nøjagtigt som du har skrevet her, så
> adskiller programmet ikke indholdet i CVS filen ved semikolon. Den bruger
> også mellemrum som adskiller.
>
> Dvs. at hvis jeg vælger "kolonne" i comboboksen, så får editboksene
> følgende indhold:
>
> Editboks 1: "1"
> Editboks 2: "Kolonne"
> Editboks 3: "2"
>
> Mens "Kolonne 3" og "Kolonne 4" ikke bliver medtaget.
Ja, som nævnt er det en 'fejl' i Classes.pas.
Nu har jeg slukket min Windoes PC igen, men jeg prøver lige at udtænke en
utestet workaround.
> Under Uses i har du noget, der hedder "StdCtrls". Det har jeg ikke som
> standard i mit Delphi. Vil det give problemer eller finder den selv ud af,
> hvad der skal hentes / gøres, når jeg tilføjer det?
Hvis du starter på et nyt projekt, skulle de forskellige 'uses' gerne dukke
op automatisk.
Prøv at lave et nyt projekt, og hold øje med 'uses' efterhånden som du
tilføjer komponenter fra paletten.
>> private
>> { Private declarations }
>> CSVFile : TStringList ;
>> CSVLine : TStringList ;
>
> Hvad gør de to ovenfor?
Det er erklæring af to variable af typen TStringList, der ligeer under
Formen.
Sammenlign det lidt med:
VAR
CSVFile : TStringList.
Man kunne også lægge dem som globale variable, men det plejer jeg ikke at
gøre.
I forhold til dit spørgsmål længere nede, se inline.
>> procedure TForm1.FormCreate(Sender: TObject);
>> begin
>> CSVFile := TStringList.Create ;
TStringList er et objekt, og ikke en statisk variabel.
Man kan sige, at der kun er en 'beskrivelse' af hvordan den ser ud.
Ovenstående linie 'bygger' et objekt, svarende til 'beskrivelsen'.
>> CSVLine := TStringList.Create ;
>> CSVLine.Delimiter := ';' ;
Sætter semikolon som feltadskiller. Desværre ser det ud til, at Borland også
synes, at blank skal være feltadskiller.
>> CSVLine.QuoteChar := ' ' ;
Sætter blank som Tekstadskiller. Normalt benytter man ", men min excel
lavede ikke lig " omkring teksterne.
>> end;
>
> Hvad vil ovenstående linier sige?
>
> Jeg har desuden undret mig over StringList, hvad det er for en størrelse.
> Den findes ikke i mine komponentlister som fx Editbokse, Open Dialog osv.
Det du 'ser', er kun den visuelle del. Ud over disse, findes der oceaner af
ikke visuelle objekter/klasser/komponenter. Forskellen er, at disse skal
man selv oprette (xxx.Create) og fjerne (xxx.Free) i programmet.
>> procedure TForm1.FormDestroy(Sender: TObject);
>> begin
>> CSVFile.Free ;
>> CSVLine.Free ;
>> end;
>
> Hvorfor lave en FormDestroy?
Det er en hændelse (Event), der kaldes nå formen bliver 'nedlagt'.
Hvis du kigger på den tilsvarende 'Create', opretter jeg de to StringList
sammen med formen, og her nedlægger vi dem igen sammen med formen.
Hvis man glemmer at oprette et objekt, får man en application error, og hvis
man glemmer at nedlægge dem, får man en memory leak.
Jeg håber, det gav lidt afklaring.
Hovsa, jeg glemte lige en workaround.
...... Finder lige dit indlæg frem igen ..... Jep, nu er jeg tilbage igen.
Nu bliver det ud af hovedet, så jeg garanterer ikke, at det virker (Jeg kan
ikke lige huske om det hedder StrReplace, samt parameter rækkefølgen) men
hvis du retter:
CSVLine.DelimitedText := CSVFile.Strings[Counter] ;
til
CSVLine.DelimitedText := StrReplace('
',#255,CSVFile.Strings[Counter] ); // erstatter blanke med #255
samt
ComboBox1.AddItem(CSVLine.Strings[0],NIL);
til
ComboBox1.AddItem(StrReplace(#255,'
',CSVLine.Strings[0],NIL)); // retter #255 tilbage til blanke.
og på samme måde:
CSVLine.DelimitedText := CSVFile.Strings[ComboBox1.ItemIndex] ;
til
CSVLine.DelimitedText := StrReplace('
',#255,CSVFile.Strings[ComboBox1.ItemIndex] ;
og igen
Edit1.Text := CSVLine.Strings[1] ;
til
Edit1.Text := StrReplace(#255,' ',CSVLine.Strings[1]) ;
osv. for edit 2..3
--
Med venlig hilsen
Stig Johansen