/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
CVS-filer og Delphi Pascal
Fra : Ukendt


Dato : 23-07-05 11:05

Hej.

Jeg har en Excelfil med en lang række data.

Der er tale om en tabel lavet i Excel, hvor hver række består af nogle data,
der hører sammen, som en form for simpel database.

Jeg har derefter gemt filen som en CVS-fil (semikolon sepereret).

Herefter ønsker jeg (hvis det er muligt) at anvende denne i mit Delphi
program.

Meningen er, at man i en comboboks skal kunne vælge imellem de muligheder,
der er i første kolonne i min cvs-fil.

Udfra det valgte i comboboksen, skal indholdet af anden, tredje og fjerde
kolonne i min CVS-fil gemmes i variabler.

Det er selvfølgelig indholdet af kolonnerne, der hører til det valgte i
første kolonne i comboboksen, der skal gemmes)

På forhånd tak for kyndig hjælp
--
/HL



 
 
Ukendt (24-07-2005)
Kommentar
Fra : Ukendt


Dato : 24-07-05 12:34

Hej.

Jeg har en Excelfil med en lang række data.

Der er tale om en tabel lavet i Excel, hvor hver række består af nogle data,
der hører sammen, som en form for simpel database.

Jeg har derefter gemt filen som en CVS-fil (semikolon sepereret).

Herefter ønsker jeg (hvis det er muligt) at anvende denne i mit Delphi
program.

Meningen er, at man i en comboboks skal kunne vælge imellem de muligheder,
der er i første kolonne i min cvs-fil.

Udfra det valgte i comboboksen, skal indholdet af anden, tredje og fjerde
kolonne i min CVS-fil gemmes i variabler.

Det er selvfølgelig indholdet af kolonnerne, der hører til det valgte i
første kolonne i comboboksen, der skal gemmes)

På forhånd tak for kyndig hjælp
--
/HL




Christian Iversen (24-07-2005)
Kommentar
Fra : Christian Iversen


Dato : 24-07-05 17:15

"Hans Larsen" <Nospam> wrote:

> Hej.
>
> Jeg har en Excelfil med en lang række data.
>
> Der er tale om en tabel lavet i Excel, hvor hver række består af nogle
> data, der hører sammen, som en form for simpel database.
>
> Jeg har derefter gemt filen som en CVS-fil (semikolon sepereret).
>
> Herefter ønsker jeg (hvis det er muligt) at anvende denne i mit Delphi
> program.
>
> Meningen er, at man i en comboboks skal kunne vælge imellem de muligheder,
> der er i første kolonne i min cvs-fil.
>
> Udfra det valgte i comboboksen, skal indholdet af anden, tredje og fjerde
> kolonne i min CVS-fil gemmes i variabler.
>
> Det er selvfølgelig indholdet af kolonnerne, der hører til det valgte i
> første kolonne i comboboksen, der skal gemmes)

Det er alt sammen meget godt, så hvad er problemet?

--
M.V.H
Christian Iversen

Ukendt (24-07-2005)
Kommentar
Fra : Ukendt


Dato : 24-07-05 17:23

"Christian Iversen" <chrivers@iversen-net.dk> skrev i en meddelelse
news:5248626.Z9bEBasEvz@iversen-net.dk...
> "Hans Larsen" <Nospam> wrote:
>
>> Hej.
>>
>> Jeg har en Excelfil med en lang række data.
>>
>> Der er tale om en tabel lavet i Excel, hvor hver række består af nogle
>> data, der hører sammen, som en form for simpel database.
>>
>> Jeg har derefter gemt filen som en CVS-fil (semikolon sepereret).
>>
>> Herefter ønsker jeg (hvis det er muligt) at anvende denne i mit Delphi
>> program.
>>
>> Meningen er, at man i en comboboks skal kunne vælge imellem de
>> muligheder,
>> der er i første kolonne i min cvs-fil.
>>
>> Udfra det valgte i comboboksen, skal indholdet af anden, tredje og fjerde
>> kolonne i min CVS-fil gemmes i variabler.
>>
>> Det er selvfølgelig indholdet af kolonnerne, der hører til det valgte i
>> første kolonne i comboboksen, der skal gemmes)
>
> Det er alt sammen meget godt, så hvad er problemet?

Det er ikke for at lyde flabet, men mere undren over, at du ikke kunne _se_
det...

Citat fra mit oprindelige indlæg:

Meningen er, at man i en comboboks skal kunne vælge imellem de muligheder,
der er i første kolonne i min cvs-fil.

Udfra det valgte i comboboksen, skal indholdet af anden, tredje og fjerde
kolonne i min CVS-fil gemmes i variabler.

Det er selvfølgelig indholdet af kolonnerne, der hører til det valgte i
første kolonne i comboboksen, der skal gemmes)

-----

Her menes selvfølgelig, hvordan jeg gør ovenstående. Helt fra bunden. Jeg
har ingen anelse - heller ej om det kan lade sig gøre.

Derfor skriver jeg, "meningen er" og giver en beskrivelse af, hvad jeg gerne
vil have.

Håber på, at I kan hjælpe mig med dette.

På forhånd tak.



Stig Johansen (24-07-2005)
Kommentar
Fra : Stig Johansen


Dato : 24-07-05 19:38

"Hans Larsen" <Nospam> wrote:

[snip]
>
> Her menes selvfølgelig, hvordan jeg gør ovenstående. Helt fra bunden. Jeg
> har ingen anelse - heller ej om det kan lade sig gøre.

Jeg vil foreslå dig at tage et godt kig på TStringList.
Du kan læse hele din CSV fil ind med TStringList.LoadFromFile.
TStringList kan også behandle 'kommaseparerede' strenge.
Når den er læst ind, loader du første felt ind i din combobox for hver
linie.
Alá:
FOR Counter := 0 TO TStringList.Count - 1 DO
ComboBox.Add(TStringList.Lines[Counter].'Values.. eller et eller andet'.

Der vil nu være en en til en relation mellem disse to objekter.
Når der vælges et item i ComboBoxen, benytter du ItemIndex som parameter til
din StringList.

Jeg har ikke lige startet Delphi op, så du må selv prøve at komme videre .

--
Med venlig hilsen
Stig Johansen

Christian Iversen (26-07-2005)
Kommentar
Fra : Christian Iversen


Dato : 26-07-05 09:59

"Hans Larsen" <Nospam> wrote:

> "Christian Iversen" <chrivers@iversen-net.dk> skrev i en meddelelse
> news:5248626.Z9bEBasEvz@iversen-net.dk...
>> "Hans Larsen" <Nospam> wrote:
>>
>>> Hej.
>>>
>>> Jeg har en Excelfil med en lang række data.
>>>
>>> Der er tale om en tabel lavet i Excel, hvor hver række består af nogle
>>> data, der hører sammen, som en form for simpel database.
>>>
>>> Jeg har derefter gemt filen som en CVS-fil (semikolon sepereret).
>>>
>>> Herefter ønsker jeg (hvis det er muligt) at anvende denne i mit Delphi
>>> program.
>>>
>>> Meningen er, at man i en comboboks skal kunne vælge imellem de
>>> muligheder,
>>> der er i første kolonne i min cvs-fil.
>>>
>>> Udfra det valgte i comboboksen, skal indholdet af anden, tredje og
>>> fjerde kolonne i min CVS-fil gemmes i variabler.
>>>
>>> Det er selvfølgelig indholdet af kolonnerne, der hører til det valgte i
>>> første kolonne i comboboksen, der skal gemmes)
>>
>> Det er alt sammen meget godt, så hvad er problemet?
>
> Det er ikke for at lyde flabet, men mere undren over, at du ikke kunne
> _se_ det...

Jeg kan godt se problemet, men én af de bedste øvelser i problemløsning er
klart at definere problemstillingen, og definere underproblemer.

Du har allerede defineret den overordnede problemstilling nogen lunde klart.
To underproblemer kunne så være:

- En CVS-fil skal indlæses til en passende datastruktur
- Datastrukturens indhold skal præsenteres i en listbox

--
M.V.H
Christian Iversen

Michael Haase (24-07-2005)
Kommentar
Fra : Michael Haase


Dato : 24-07-05 18:53

Hans Larsen skrev:

> Jeg har derefter gemt filen som en CVS-fil (semikolon sepereret).
>
> Herefter ønsker jeg (hvis det er muligt) at anvende denne i mit Delphi
> program.
>
> Meningen er, at man i en comboboks skal kunne vælge imellem de muligheder,
> der er i første kolonne i min cvs-fil.
>
> Udfra det valgte i comboboksen, skal indholdet af anden, tredje og fjerde
> kolonne i min CVS-fil gemmes i variabler.
>
> Det er selvfølgelig indholdet af kolonnerne, der hører til det valgte i
> første kolonne i comboboksen, der skal gemmes)


Jeg ville indlæse en linje fra CVS-filen ad gangen, udtrække indholdet
af første kolonne og lægge det i comboboxen, og så fremdeles indtil der
ikke er flere linjer i filen.
Dernæst ville jeg så indlæse variablerne når der bliver foretaget et
valg i comboboxen.

Altså noget lignende med


placering i combobox :=0;
while not eof(CSV-fil)
begin
readln(CSVfil,linje);
Find position af første semikolon;
combobox.items[placering i combobox]:=Copy(Linje; 0, positionen-1);
inc(placering i combobox);
end;

Så vidt jeg kan overskue vil dette princip udfylde comboboxen. Når der
så foretages et valg der, skal variablerne indlæses. Der kan du prøve
noget med:


while i<combobox.itemindex do
readln(CSVfil,linje);
readln(CSVfil,linje);
Find positioner af samtlige semikolonner
variabel 1 := indholdet mellem 2 og 3 semikolon
variabel 2 := indholdet mellem 3 og 4 semikolon
osv, osv.

Du skal lige være opmærksom på at det jeg her har skrevet er meget
eksemplificeret; men du kan bare spørge hvis der er noget du skal have
forklaret.

--
Michael Haase

Ukendt (25-07-2005)
Kommentar
Fra : Ukendt


Dato : 25-07-05 15:53

"Michael Haase" <micvans@netscape.invalid> skrev i en meddelelse
news:8ae58$42e3d53c$3e3d8433$18592@news.arrownet.dk...
> Hans Larsen skrev:
>
>> Jeg har derefter gemt filen som en CVS-fil (semikolon sepereret).
>>
>> Herefter ønsker jeg (hvis det er muligt) at anvende denne i mit Delphi
>> program.
>>
>> Meningen er, at man i en comboboks skal kunne vælge imellem de
>> muligheder,
>> der er i første kolonne i min cvs-fil.
>>
>> Udfra det valgte i comboboksen, skal indholdet af anden, tredje og fjerde
>> kolonne i min CVS-fil gemmes i variabler.
>>
>> Det er selvfølgelig indholdet af kolonnerne, der hører til det valgte i
>> første kolonne i comboboksen, der skal gemmes)
>
>
> Jeg ville indlæse en linje fra CVS-filen ad gangen, udtrække indholdet af
> første kolonne og lægge det i comboboxen, og så fremdeles indtil der ikke
> er flere linjer i filen.
> Dernæst ville jeg så indlæse variablerne når der bliver foretaget et valg
> i comboboxen.
>
> Altså noget lignende med
>
>
> placering i combobox :=0;
> while not eof(CSV-fil)
> begin
> readln(CSVfil,linje);
> Find position af første semikolon;
> combobox.items[placering i combobox]:=Copy(Linje; 0, positionen-1);
> inc(placering i combobox);
> end;
>
> Så vidt jeg kan overskue vil dette princip udfylde comboboxen. Når der så
> foretages et valg der, skal variablerne indlæses. Der kan du prøve noget
> med:
>
>
> while i<combobox.itemindex do
> readln(CSVfil,linje);
> readln(CSVfil,linje);
> Find positioner af samtlige semikolonner
> variabel 1 := indholdet mellem 2 og 3 semikolon
> variabel 2 := indholdet mellem 3 og 4 semikolon
> osv, osv.
>
> Du skal lige være opmærksom på at det jeg her har skrevet er meget
> eksemplificeret; men du kan bare spørge hvis der er noget du skal have
> forklaret.

Kære Michael.

Jeg er desværre lidt på herrens mark her.

Kan jeg få dig til at skrive lidt til hver linie / enkelte linier, så jeg
kan komme lidt videre derfra.

På forhånd tak.



Michael Haase (25-07-2005)
Kommentar
Fra : Michael Haase


Dato : 25-07-05 20:04

Hans Larsen skrev:


> Kan jeg få dig til at skrive lidt til hver linie / enkelte linier, så jeg
> kan komme lidt videre derfra.
>

Lad os sige at du har en fil som hedder hala.csv hvor dine data f.eks er:

FørsteKolonne;AndenKolonne;Tredjekolonne

Du vil så benytte "FørsteKolonne" i comboboxen, og de andre som "varible"

Først skal "FørsteKolonne" indlæses i comboboxen:

procedure IndlaesFoersteKolonne;
var datafil : textfile;
s : string:
position : integer;
begin
AssignFile(datafil, 'hala.csv');    { hala.csv skal benyttes som    
                datafil }
Reset(datafil);         {Gør fil klar til at læses}
while not eof(datafil)      {Fortsæt så længe der er data }
begin
Readln(datafil, s); {læs linje }
position:=pos(';',S);      {Find første placering af ;}
combobox1.items.add(copy(S,1,position));
               {Udtræk første værdi og tilføj
                til combobox1}
end;
CloseFile(datafil);         {Luk fil}
end;

Nu skulle alle dine første kolonneværdier ligge i comboboxen. Når der
foretages et valg der, skal de tilhørende værdier indlæses:

Procedure IndlaesTilhoerendeVaerdier;
var datafil : textfile;
s : string:
position,i : integer;
variabel1, variabel2 : dine variabler;
begin
AssignFile(datafil, 'hala.csv');    { hala.csv skal benyttes som    
                datafil }
Reset(datafil);         {Gør fil klar til at læses}
for i:=0 to combobox1.itemindex do   {Spring uønskede linjer over}
readln(datafil);
readln(datafil,s);         {Læs ønskede linje}
closefile(datafil);         {Luk fil igen}
i:=0;
startpos:=1;

slutpos:=pos(';',s);         {Find placering af ;}
variabel1:=(copy(s,startpos,slutpos-1));
Delete(s,startpos,slutpos);      {fjern førstekolonne, så 2 og 3                   
er tilbage}

slutpos:=pos(';',s);         {Find næste placering af ;}
variabel2:=(copy(s,startpos,slutpos-1));
Delete(s,startpos,slutpos);      {fjern andenkolonne, så 3. er
                tilbage}
variabel3:=(s);
end;

Nu skulle variablerne så være blevet indlæst. Hvis der er mere end de
par varible som jeg har vist her, skal linjerne med slutpos,varibel og
delete gentages efter behov.

Håber det har kastet lidt mere lys over det.
--
Michael Haase

Ukendt (25-07-2005)
Kommentar
Fra : Ukendt


Dato : 25-07-05 17:00

Nå, nu strikkede jeg alligevel et eksempel sammen.
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
............

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
***********************
******** Projektfil**********
program TestCSV;

uses
Forms,
TestCSVU in 'TestCSVU.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
***********************

******** Unitfil**********
unit TestCSVU;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
OpenDialog1: TOpenDialog;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ComboBox1Select(Sender: TObject);
private
{ Private declarations }
CSVFile : TStringList ;
CSVLine : TStringList ;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
VAR
Counter : Integer ;
begin
IF OpenDialog1.Execute THEN BEGIN
CSVFile.LoadFromFile(OpenDialog1.FileName);
Memo1.Text := CSVFile.Text ;
ComboBox1.Clear ;
FOR Counter := 0 TO CSVFile.Count - 1 DO BEGIN
CSVLine.DelimitedText := CSVFile.Strings[Counter] ;
IF CSVLine.Count > 0 THEN
ComboBox1.AddItem(CSVLine.Strings[0],NIL);
END;
END;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
CSVFile := TStringList.Create ;
CSVLine := TStringList.Create ;
CSVLine.Delimiter := ';' ;
CSVLine.QuoteChar := ' ' ;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
CSVFile.Free ;
CSVLine.Free ;
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
IF ComboBox1.ItemIndex > -1 THEN BEGIN
CSVLine.DelimitedText := CSVFile.Strings[ComboBox1.ItemIndex] ;
Edit1.Text := CSVLine.Strings[1] ;
Edit2.Text := CSVLine.Strings[2] ;
Edit3.Text := CSVLine.Strings[3] ;
END ;
end;

end.
***********************

******** DFM fil**********
object Form1: TForm1
Left = 192
Top = 107
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object ComboBox1: TComboBox
Left = 64
Top = 80
Width = 145
Height = 21
ItemHeight = 13
TabOrder = 0
Text = 'ComboBox1'
OnSelect = ComboBox1Select
end
object Edit1: TEdit
Left = 224
Top = 80
Width = 121
Height = 21
TabOrder = 1
Text = 'Edit1'
end
object Edit2: TEdit
Left = 360
Top = 80
Width = 121
Height = 21
TabOrder = 2
Text = 'Edit2'
end
object Edit3: TEdit
Left = 496
Top = 80
Width = 121
Height = 21
TabOrder = 3
Text = 'Edit3'
end
object Button1: TButton
Left = 64
Top = 32
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 4
OnClick = Button1Click
end
object Memo1: TMemo
Left = 64
Top = 112
Width = 553
Height = 265
Lines.Strings = (
'Memo1')
TabOrder = 5
end
object OpenDialog1: TOpenDialog
Left = 144
Top = 32
end
end
***********************


--

Med venlig hilsen/Best regards
Stig Johansen




Ukendt (25-07-2005)
Kommentar
Fra : Ukendt


Dato : 25-07-05 18:55

"Stig Johansen" <stig_johansen_it_at_hotmail.com> skrev i en meddelelse
news:42e5096f$0$18640$14726298@news.sunsite.dk...

Kære Stig.

Jeg har kigget på det, som du har lavet her, og det virker ved første
øjekast som noget, som jeg rigtigt godt kan bruge.

Men jeg tænkte på noget. Se inline:

> Nå, nu strikkede jeg alligevel et eksempel sammen.
> 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.

> 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.

> ******** Projektfil**********
> program TestCSV;
>
> uses
> Forms,
> TestCSVU in 'TestCSVU.pas' {Form1};
>
> {$R *.res}
>
> begin
> Application.Initialize;
> Application.CreateForm(TForm1, Form1);
> Application.Run;
> end.
> ***********************
>
> ******** Unitfil**********
> unit TestCSVU;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
> Forms,
> Dialogs, StdCtrls;

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?

> type
> TForm1 = class(TForm)
> ComboBox1: TComboBox;
> Edit1: TEdit;
> Edit2: TEdit;
> Edit3: TEdit;
> OpenDialog1: TOpenDialog;
> Button1: TButton;
> Memo1: TMemo;
> procedure Button1Click(Sender: TObject);
> procedure FormCreate(Sender: TObject);
> procedure FormDestroy(Sender: TObject);
> procedure ComboBox1Select(Sender: TObject);
> private
> { Private declarations }
> CSVFile : TStringList ;
> CSVLine : TStringList ;

Hvad gør de to ovenfor?

> public
> { Public declarations }
> end;
>
> var
> Form1: TForm1;
>
> implementation
>
> {$R *.dfm}
>
> procedure TForm1.Button1Click(Sender: TObject);
> VAR
> Counter : Integer ;
> begin
> IF OpenDialog1.Execute THEN BEGIN
> CSVFile.LoadFromFile(OpenDialog1.FileName);
> Memo1.Text := CSVFile.Text ;
> ComboBox1.Clear ;
> FOR Counter := 0 TO CSVFile.Count - 1 DO BEGIN
> CSVLine.DelimitedText := CSVFile.Strings[Counter] ;
> IF CSVLine.Count > 0 THEN
> ComboBox1.AddItem(CSVLine.Strings[0],NIL);
> END;
> END;
> end;
>
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> CSVFile := TStringList.Create ;
> CSVLine := TStringList.Create ;
> CSVLine.Delimiter := ';' ;
> CSVLine.QuoteChar := ' ' ;
> 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.

> procedure TForm1.FormDestroy(Sender: TObject);
> begin
> CSVFile.Free ;
> CSVLine.Free ;
> end;

Hvorfor lave en FormDestroy?

> procedure TForm1.ComboBox1Select(Sender: TObject);
> begin
> IF ComboBox1.ItemIndex > -1 THEN BEGIN
> CSVLine.DelimitedText := CSVFile.Strings[ComboBox1.ItemIndex] ;
> Edit1.Text := CSVLine.Strings[1] ;
> Edit2.Text := CSVLine.Strings[2] ;
> Edit3.Text := CSVLine.Strings[3] ;
> END ;
> end;
>
> end.
> ***********************
>
> ******** DFM fil**********
> object Form1: TForm1
> Left = 192
> Top = 107
> Width = 696
> Height = 480
> Caption = 'Form1'
> Color = clBtnFace
> Font.Charset = DEFAULT_CHARSET
> Font.Color = clWindowText
> Font.Height = -11
> Font.Name = 'MS Sans Serif'
> Font.Style = []
> OldCreateOrder = False
> OnCreate = FormCreate
> OnDestroy = FormDestroy
> PixelsPerInch = 96
> TextHeight = 13
> object ComboBox1: TComboBox
> Left = 64
> Top = 80
> Width = 145
> Height = 21
> ItemHeight = 13
> TabOrder = 0
> Text = 'ComboBox1'
> OnSelect = ComboBox1Select
> end
> object Edit1: TEdit
> Left = 224
> Top = 80
> Width = 121
> Height = 21
> TabOrder = 1
> Text = 'Edit1'
> end
> object Edit2: TEdit
> Left = 360
> Top = 80
> Width = 121
> Height = 21
> TabOrder = 2
> Text = 'Edit2'
> end
> object Edit3: TEdit
> Left = 496
> Top = 80
> Width = 121
> Height = 21
> TabOrder = 3
> Text = 'Edit3'
> end
> object Button1: TButton
> Left = 64
> Top = 32
> Width = 75
> Height = 25
> Caption = 'Button1'
> TabOrder = 4
> OnClick = Button1Click
> end
> object Memo1: TMemo
> Left = 64
> Top = 112
> Width = 553
> Height = 265
> Lines.Strings = (
> 'Memo1')
> TabOrder = 5
> end
> object OpenDialog1: TOpenDialog
> Left = 144
> Top = 32
> end
> end
> ***********************








Stig Johansen (25-07-2005)
Kommentar
Fra : Stig Johansen


Dato : 25-07-05 19:55

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

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31962
Nyheder : 719565
Indlæg : 6408173
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste