|
| TMemo til TQuery via en metode Fra : Michael [2800] |
Dato : 13-04-04 16:42 |
|
Hej,
Jeg prøver at overføre indholdet i en TMemo til en TQuery via en metode
'runSQL()' men kan ikke få skidtet til at virke, hvad laver jeg forkert
eller rettere hvad skal jeg gøre?
procedure TForm5.Button1Click(Sender: TObject);
begin
runSQL( Memo1.Lines );
end;
procedure TForm5.runSQL(strL: TStrings);
begin
with DM.Query1 do
begin
Active := false;
SQL.AddStrings( strL ); // her er problemet, tror jeg
Active := true;
end;
end;
/md
| |
Ukendt (13-04-2004)
| Kommentar Fra : Ukendt |
Dato : 13-04-04 17:10 |
|
"Michael [2800]" <michael@mhcdan.dk> wrote in message
news:407c0a03$0$535$edfadb0f@dread14.news.tele.dk...
> SQL.AddStrings( strL ); // her er problemet, tror jeg
Prøv SQL:= strL;
hilsen
Uffe
| |
Stig Johansen (14-04-2004)
| Kommentar Fra : Stig Johansen |
Dato : 14-04-04 05:53 |
|
"Uffe Kousgaard" <look_at_ www.routeware.dk> wrote:
> Prøv SQL:= strL;
Jeg tror, den er lidt farlig. Jeg ville nok gøre sådan her:
procedure TForm5.Button1Click(Sender: TObject);
begin
runSQL( Memo1.Text ); // ændret her
end;
procedure TForm5.runSQL(strL: String); // ændret her
begin
with DM.Query1 do
begin
Active := false;
SQL.Text := strL ; // her burde problemet være løst, tror jeg
Active := true;
end;
end;
--
Med venlig hilsen
Stig Johansen
| |
Michael [2800] (14-04-2004)
| Kommentar Fra : Michael [2800] |
Dato : 14-04-04 06:52 |
|
> Jeg tror, den er lidt farlig. Jeg ville nok gøre sådan her:
Hvad er grunden til at du syntes at jeg/man skal bruge Text og ikke
TStrings?
/md
| |
Stig Johansen (15-04-2004)
| Kommentar Fra : Stig Johansen |
Dato : 15-04-04 05:00 |
|
Michael [2800] wrote:
>> Jeg tror, den er lidt farlig. Jeg ville nok gøre sådan her:
> Hvad er grunden til at du syntes at jeg/man skal bruge Text og ikke
> TStrings?
Fordi jeg selv plejer selv at gøre det.
Nej seriøst, ved at bruge Text, slæber du 'kun' rundt med en streng mellem
dine procedure og ikke et helt objekt.
Det sparer både plads og CPU.
--
Med venlig hilsen
Stig Johansen
| |
Michael [2800] (15-04-2004)
| Kommentar Fra : Michael [2800] |
Dato : 15-04-04 06:52 |
|
> Fordi jeg selv plejer selv at gøre det.
Thi hi
>
> Nej seriøst, ved at bruge Text, slæber du 'kun' rundt med en streng mellem
> dine procedure og ikke et helt objekt.
> Det sparer både plads og CPU.
Det lyder sand nok.
Tak for svaret.
/md
| |
Henry (19-04-2004)
| Kommentar Fra : Henry |
Dato : 19-04-04 17:37 |
|
> >> Jeg tror, den er lidt farlig. Jeg ville nok gøre sådan her:
> > Hvad er grunden til at du syntes at jeg/man skal bruge Text og ikke
> > TStrings?
>
> Fordi jeg selv plejer selv at gøre det.
Jow jow
> Nej seriøst, ved at bruge Text, slæber du 'kun' rundt med en streng mellem
> dine procedure og ikke et helt objekt.
Undskyld men jeg er ikke helt enig i din påstand, men jeg kan jo tage fejl,
at bruge et "object" som parameter er da kun en pointer, hvad skulle det
lige koste ekstra? Til sammenligning er stort set alle events udstyret med
et object (sender : TObject) - mener du virkeligt så at alt Delphi kode er
ineffektiv og dyr?
> Det sparer både plads og CPU.
Ja det er jo din påstand, hvad underbygger du det med?
Det er ikke et angreb, jeg er bare lidt overrasket over påstanden, det vil
jo flytte en hel del på min opfattelse af emnet.
mvh
Henry
| |
Stig Johansen (20-04-2004)
| Kommentar Fra : Stig Johansen |
Dato : 20-04-04 02:33 |
|
Henry wrote:
> Undskyld men jeg er ikke helt enig i din påstand, men jeg kan jo tage
> fejl, at bruge et "object" som parameter er da kun en pointer, hvad skulle
> det lige koste ekstra?
Hvis det kun er en pointer, så er vi enige om, at det er det 'billigste'.
Man(jeg) kan dog nogle gange være i tvivl om hvornår Delphi autogenerer en
'by value' i stedet for 'by reference'.[1]
> Til sammenligning er stort set alle events udstyret
> med et object (sender : TObject) - mener du virkeligt så at alt Delphi
> kode er ineffektiv og dyr?
Det kunne jeg ikke drømme om at påstå.
> Det er ikke et angreb, jeg er bare lidt overrasket over påstanden, det vil
> jo flytte en hel del på min opfattelse af emnet.
Du skal *ikke* ændre opfattelse af emnet.
[1]
'I gamle dage' blev der i pascal skelnet skapt mellem procedure a(x) og
procedure a(*var* x). Førstnævnte placerer en kopi på stakken, mens
sidstnævnte placerer adressen på stakken.
Derudover brugte man altid ^ til derefencing - dette blev 'automatiseret'
med Delphi 1.
Det vil sige, at man(jeg) kan komme i tvivl om Delphi opfatter en given kode
som
Procedure a(x) - pointer
eller
Procedure a(x^) - værdi
Og nej, jeg er *ikke* i tvivl når det gælder mine egne programmer.
--
Med venlig hilsen
Stig Johansen
| |
Nicolai Hansen (21-04-2004)
| Kommentar Fra : Nicolai Hansen |
Dato : 21-04-04 09:26 |
|
> Det vil sige, at man(jeg) kan komme i tvivl om Delphi opfatter en given kode
> som
> Procedure a(x) - pointer
> eller
> Procedure a(x^) - værdi
Overføres som pointers:
Pointer, ^Var (^Integer etc), PVar (PInteger etc, disse er defineret i
nogle Delphi includes som ^Var), Objekter (alt nedarvet fra TObject),
Interfaces (COM objekter og den slags), ANSI strenge (incl den
almindelige String type).
Den nederste er speciel da Delphi, udover at overføre den som pointer,
incrementerer dens reference count så du - hvis du ændrer i strengen -
vil lave en kopi af denne.
procedure Test(var s: String);
vil lave en kopi af strengen INDEN den sendes til proceduren, og
overføre den nye streng som pointer (med reference count 1 i strengen
så den kan ændres i).
Forskellen er derfor at med "var s: String" kan du ændre i den
oprindelige streng - men med "s: String" kan du ikke.
procedure Test(s: String);
begin
s:='a'; // her kopieres strengen s
end;
procedure Test2(var s: String);
begin
s:='b';
end;
procedure Main;
var
s, s2: String;
begin
s:='xxxx';
s2:=s; // strengen kopieres ikke her - pointerne s2 og s peger på
samme streng med ref count 2.
Test(s); // <-- s='xxxx' efter kaldet. Lige inden kaldet får
strengen 's' ref count 3. Efter retur til Main er ref count 2 igen.
Test2(s); // her kopieres strengen s. s og s2 er nu forskellige,
begge strenge har ref count 1.
showmessage(s); // <-- s='b' efter kaldet.
showmessage(s2); // s2 er uændret.
end;
Det som til gengæld er underligt er forskellen (?) mellem
procedure Test(o: TObject); og procedure Test(var o: TObject);
Hvis der er nogen som ved hvad forskellen er her, forklar venligst :)
/Nic
| |
Nicolai Hansen (20-04-2004)
| Kommentar Fra : Nicolai Hansen |
Dato : 20-04-04 07:42 |
|
> > Nej seriøst, ved at bruge Text, slæber du 'kun' rundt med en streng mellem
> > dine procedure og ikke et helt objekt.
> Undskyld men jeg er ikke helt enig i din påstand, men jeg kan jo tage fejl,
> at bruge et "object" som parameter er da kun en pointer, hvad skulle det
> lige koste ekstra? Til sammenligning er stort set alle events udstyret med
> et object (sender : TObject) - mener du virkeligt så at alt Delphi kode er
> ineffektiv og dyr?
Det vil ikke gøre nogen forskel - i Delphi overføres både strenge og
objekter som pointers.
> > Det sparer både plads og CPU.
> Ja det er jo din påstand, hvad underbygger du det med?
>
> Det er ikke et angreb, jeg er bare lidt overrasket over påstanden, det vil
> jo flytte en hel del på min opfattelse af emnet.
Det er et spørgsmål om "Objekt.Text" står i den ene eller den anden
procedure.
Jeg kan ikke se nogen hastighedsforskel overhovedet. til gengæld er
jeg ikke i tvivl om at Objekt2.Text:=Objekt1.Text er hurtigere end
Object2.Lines.AddStrings(Objekt1.Lines).
| |
|
|