Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];

Вниз

Передать в Format дату   Найти похожие ветки 

 
Ega23 ©   (2011-10-19 10:24) [40]


> Есть принципиальная разница, что строго Text нужно применять?


В твоём конкретном примере - нет. Вообще - есть, и довольно серьёзная.
constructor TADOQuery.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FSQL := TStringList.Create;
 TStringList(FSQL).OnChange := QueryChanged;
 Command.CommandTextAlias := "SQL"; { Do not localize }
end;



> а Length(P) - 1 и High(P) не даст одно и то же для конечного параметра цикла?


В твоём конкретном случае - даст. В общем - нет.


> Согласен, нужно думать.


На самом деле тут всё просто.
Либо делаешь полностью универсальную процедуру, подаёшь в неё Connection, текст запроса и параметры.
Либо делаешь паблик-метод своего датамодуля и в нём уже используешь один и тот же TADOCommand. Т.е. просто текст запроса и параметры.
Либо (но этот вариант для D7 не прокатит) делаешь class helper для того же TADOCommand


 
Laguna ©   (2011-10-19 10:40) [41]

>Ega23

C ADO раньше практиковал применение. Сейчас хочу перейти на ADS. Вот что получилось в новом виде:


procedure OperFromTab(AC : TAdsConnection; St : String; const P : array of variant);
Var
 i : Integer;
begin
 with TADSQuery.Create(nil) do
  try
    ADSConnection := AC;
    ParamCheck := True;
    SQL.Text := St;
    if Length(P) <> 0 then
     for i := Low(P) to High(P) do
      Params[i].Value := P[i];
    ExecSQL;
  finally
    Free;
  end;
end;


Вопрос с Blob-полями остается открытым


 
Ega23 ©   (2011-10-19 10:47) [42]

Не знаю что такое ADS.

Но рекомендую внимательно посмотреть на TADSConnection. Вдруг у него уже есть аналог TADOConnection.Execute, но с параметрами?


 
OW ©   (2011-10-19 11:02) [43]


> Laguna ©   (19.10.11 10:40) [41]

ну вот, уже лучше, имхо


> Вопрос с Blob-полями остается открытым

да не совсем..
вечером посмотрю, надо понаписать и это дело, пригодится.

>> class helper для того же TADOCommand
Вот - вот :(

> для D7 не прокатит

это мне ИШ сказал еще, типа, хрень делаешь. Был бы хелпер - смысл был бы, а так - хрень. Но я не согласен :)
Удобно, если по мелочи более 2х раз подряд, например, идет.
От основной мысли не так отвлекает, не мозолит глаза реализация, сосредотачиваешься больше на логику. (хотя и 5-6 строк лишних - не такое уж отвлечение от мысли, но все равно)


 
Ega23 ©   (2011-10-19 11:06) [44]


> Удобно, если по мелочи более 2х раз подряд, например, идет.

Я всё равно предпочитаю на каждую команду свой TADOCommand держать. По крайней мере там, где параметры нужны.


> ну вот, уже лучше, имхо

Это да, гораздо лучше.
if Length(P) <> 0 then
    for i := Low(P) to High(P) do
     Params[i].Value := P[i];

Только вот это вот зачем? for i := 0 to Length(P) - 1
Если длина 0, то цикл просто ни разу не выполнится.


 
Laguna ©   (2011-10-19 11:17) [45]


> Не знаю что такое ADS.


http://www.sybase.com/products/databasemanagement/advantagedatabaseserver


> Только вот это вот зачем? for i := 0 to Length(P) - 1Если
> длина 0, то цикл просто ни разу не выполнится.


А если будет так for i := 0 to High(P) при Length(P)=0 тоже ведь не будет цикл ни разу срабатывать.

Я считаю что High(P) и Length(P) - 1 равнозначны.


 
Медвежонок Пятачок ©   (2011-10-19 11:20) [46]

for i := 0 to min(High(P),Parameters.Count) do


 
Ega23 ©   (2011-10-19 11:23) [47]


> Я считаю что High(P) и Length(P) - 1 равнозначны.


Нет.

procedure TForm19.Button2Click(Sender: TObject);
var
 arr: array[3..4] of Integer;
begin
 ShowMessage(IntToStr(Length(arr)));
 ShowMessage(IntToStr(High(arr)));
end;


 
OW ©   (2011-10-19 11:29) [48]

>>Только вот это вот зачем? for i := 0 to Length(P) - 1
не смотрел на это. так, в общем смотрел.

да что мудрить
for i := 0 to Parameters.Count - 1 do

не надо high | low смотреть. Ошибся - ССЗБ.
или, на крайняк, if длины <> then raise Exception.create("ССЗБ");


 
Laguna ©   (2011-10-19 11:37) [49]

>Ega23

Ну, как говорится, мастерство не пропьешь. Снимаю шляпу :)

Действительно, запустил тестовую строку без параметров

 OperFromTab(DM1.AdsConnection2, "DELETE FROM PriTab ", []);

и вот что получил
http://s017.radikal.ru/i433/1110/d9/d20e56fcfa34.jpg

Теперь я однозначно знаю, что правильным будет применение Length(P) - 1


 
Ega23 ©   (2011-10-19 11:45) [50]


> Теперь я однозначно знаю, что правильным будет применение
> Length(P) - 1


Нет не так. Либо Low to High, либо 0 to Length - 1


var
 arr: array of Integer;
begin
 SetLength(arr, 0);
 ShowMessage(IntToStr(Low(arr)));
 ShowMessage(IntToStr(High(arr)));

Т.е. 0 to -1 Значит ни разу не выполнится.


 
Омлет ©   (2011-10-19 11:47) [51]

> Я считаю что High(P) и Length(P) - 1 равнозначны.

Для дин.массивов равнозначны.


 
Laguna ©   (2011-10-19 11:58) [52]

Хм, немного поспешил. Ведь при отсутствии параметров Length(P) - 1 тоже вернет -1. Значит тоже, что и High(P).


 
Ega23 ©   (2011-10-19 12:04) [53]


> Хм, немного поспешил. Ведь при отсутствии параметров Length(P)
> - 1 тоже вернет -1. Значит тоже, что и High(P).


Ты либо от Low до High используй, либо от N до M. А вот скрещивать их лучше не стоит, можно наколоться здорово.


 
Laguna ©   (2011-10-19 12:15) [54]

ОК, еще вариант использую как Params.Count? но почему мне компилятор не дает посмотреть его значение в режиме отладки?

http://s51.radikal.ru/i134/1110/44/5d1cff8cf816.jpg


 
Медвежонок Пятачок ©   (2011-10-19 12:19) [55]

Потому что нет такого свойства Params


 
Ega23 ©   (2011-10-19 12:20) [56]


> ОК, еще вариант использую как Params.Count?


Да что-ж тебя на извращения-то так тянет?????


 
Laguna ©   (2011-10-19 12:27) [57]


> Потому что нет такого свойства Params

http://s017.radikal.ru/i443/1110/85/bdbf66b42509.jpg


> Да что-ж тебя на извращения-то так тянет?????

как вариант хотелось рассмотреть.
Все, останавливаюсь на for i := Low(P) to High(P) do


 
Ega23 ©   (2011-10-19 12:32) [58]


> Все, останавливаюсь на for i := Low(P) to High(P) do


Я бы на твоём месте остановился на варианте for i:=0 to Params.Count - 1 do


 
Laguna ©   (2011-10-19 12:41) [59]


> Ega23 ©   (19.10.11 12:20) [56]
> ОК, еще вариант использую как Params.Count?
>Да что-ж тебя на извращения-то так тянет?????


???


> Ega23 ©   (19.10.11 12:32) [58]
> > Все, останавливаюсь на for i := Low(P) to High(P) do
>Я бы на твоём месте остановился на варианте for i:=0 to Params.Count - 1 do


 
Ega23 ©   (2011-10-19 12:43) [60]


> >Да что-ж тебя на извращения-то так тянет?????
>
>
> ???


Pred(Params.Count)


 
Laguna ©   (2011-10-19 12:49) [61]


> Pred(Params.Count)


:))) у каждого свой стиль. Главное чтобы конечный результат был правильным.


 
Ega23 ©   (2011-10-19 12:57) [62]


>  у каждого свой стиль.


Плохой стиль. Не делай так.


 
Anatoly Podgoretsky ©   (2011-10-19 13:06) [63]

> Ega23  (19.10.2011 11:45:50)  [50]

Притом, первое идеологически вернее.


 
Laguna ©   (2011-10-19 13:10) [64]


> Плохой стиль. Не делай так.


Для этого есть серьезный аргумент?

6 = 7 -1 (Pred(7))
7 = 6 + 1(Succ(6))


 
Anatoly Podgoretsky ©   (2011-10-19 13:10) [65]


> Я бы на твоём месте остановился на варианте for i:=0 to
> Params.Count - 1 do

Тоже идеологически не верно, что будет если Low=10, а High=11
А вот Low to High всегда будет работать.


 
Anatoly Podgoretsky ©   (2011-10-19 13:12) [66]


>  with TADOQuery.Create(nil) do
>   try
>     ADOConnection := DM1.AdoConnection1;
>     ParamCheck := True;
>     SQL.Clear;
>     for i := 0 to High(P) do
>      Params[i].Value := P[i];

Как тогда прикажешь понимать, когда тебе говорят, что у ADO нет свойства Params, а ты все равно настаиваешью


 
Ega23 ©   (2011-10-19 13:15) [67]


> Тоже идеологически не верно, что будет если Low=10, а High=11


Ошибка будет. Ибо нефиг.
Зато параметры - уж точно все будут охвачены.
И, кстати, ошибка в обоих случаях будет.


 
Laguna ©   (2011-10-19 13:17) [68]


> Как тогда прикажешь понимать, когда тебе говорят, что у
> ADO нет свойства Params, а ты все равно настаиваешью


[41]


 
Laguna ©   (2011-10-19 13:23) [69]

Я думаю не стоит уж так все усложнять. Массив то формируется динамически. А так как порядок элементов массива всегда начинаются с 0, то логично , что

Low(P) - всегда будет 0,
а High(P) - количество элементов - 1

Так ведь?


 
Ega23 ©   (2011-10-19 13:36) [70]


> Так ведь?


Так. Только в одном случае ты пройдёшь по всем элементам массива, а в другом - по всем параметрам запроса.
Чуешь разницу?


 
OW ©   (2011-10-19 13:39) [71]

по идее - да

Мне понравился Lotus в этом плане. По умолчанию с 0, но можно переопределить, с любого индекса.
Хотя, что со скриптового языка взять, кроме анализов :)


 
Ega23 ©   (2011-10-19 13:44) [72]

Давайте уже закончим данную ветку, это становится невыносимым...


 
Laguna ©   (2011-10-19 13:49) [73]

Ок. Всем спасибо за помощь.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.006 c
2-1318975668
Gu
2011-10-19 02:07
2012.01.29
номер недели


1-1283001637
alexjfx
2010-08-28 17:20
2012.01.29
многострочный listbox


15-1318345230
Awesome-o 4000
2011-10-11 19:00
2012.01.29
Прошу дать совет


4-1254322800
ackii
2009-09-30 19:00
2012.01.29
помогите разобраться с WH_DEBUG


2-1319204159
Alez
2011-10-21 17:35
2012.01.29
Не правильно работает код после перехода на Delphi XE2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский