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

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409080
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste