Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 100
от 18.04.2005, 23:10

Администратор:Калашников О.А.
В номере:Вопросов: 3, Ответов: 7


Вопрос № 19640: У меня вопрос вот в чем. Как передавать аргументом в функцию указатель на текст из компонент типа Edit? Неужели так и придется писать, как в приложении? Там видно, что сначала объявляем string, указатель на строку, затем передаем текст из...
Вопрос № 19665: Доброго времени суток. Пояснение и дополнение к вопросу №19602(Поскольку по первому же ответу понятно, что я не корректно задал вопрос) Параметр запроса выбирается из списка ComboBox на RunTime, по этому и использую св-во Text. Далее...
Вопрос № 19666: Доброго времени суток. Пояснение к вопросу №19603 Сразу скажу: 1. я неприкалываюсь. 2. по поводу DOWNTO я прекрасно осведомлен. 3. прошу обратить внимание while работает. Запускаю цикл. var fi:array[0..220]of real; for...

Вопрос № 19640
У меня вопрос вот в чем.
Как передавать аргументом в функцию указатель на текст из компонент типа Edit?
Неужели так и придется писать, как в приложении?
Там видно, что сначала объявляем string, указатель на строку, затем передаем текст из Edit в объявленный стринг, затем получаем указатель на этот стринг, который и передаем в функцию.
Нельзя ли как нибудь попроще? Без объявления лишних поинтеров и строк сразу передавать строку как указатель?

Приложение:

Отправлен: 13.04.2005, 12:50
Вопрос задал: Большаков Сергей Владимирович (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: sir henry
Здравствуйте, Большаков Сергей Владимирович!
А Вы не пробовали сразу строку компонента типа Edit в PChar преобразовать? Чем Вам вообще тип PChar не нравиться?
--------------------
var
l1, l2: PChar;
Begin
l2:=PChar(Edit1.Text);
....
End;
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 13.04.2005, 14:33

Отвечает: ImDeath
Мое почтение, Большаков Сергей Владимирович.
Передавать ComboBox1.Text (и подобное) прямо как указатель нельзя, потому как свойство Text объекта ComboBox1 не является переменной, а является всего лишь ссылкой на функции которые умеют возвращать и помещать текст в нужную вам переменную. Так как мы не знаем, где находится переменная, мы и ссылаться на нее не можем. Кстати свойство Text работает через функцию GetText и процедуру SetText, которые сами не знают адреса требуемой переменной :).
В вашем случае, насколько я вижу, сократить можно только так, как написано в приложении.

Приложение:

Ответ отправил: ImDeath (статус: 1-ый класс)
Отправлен: 13.04.2005, 22:29
Оценка за ответ: 5


Вопрос № 19665
Доброго времени суток.
Пояснение и дополнение к вопросу №19602(Поскольку по первому же ответу
понятно, что я не корректно задал вопрос)
Параметр запроса выбирается из списка ComboBox на RunTime, по этому и использую св-во Text.
Далее,

ADOQuery.Parameters.ParamByName('pname').Value:=ComboBox1.Text;
Ну да ладно с этими закорючками, оказывается он правильно выбирает имя,
но почему-то запрос выдает всего 1 запись, хотя с этим именем их в таблице около 10.
Sql текст этого запроса такой
select * from data where name=:pName
Кстати в Win98 все работает правильно.
вопрос- что за чертовщина и как с ней бороться? Может к гадалке сходить ;)
Отправлен: 13.04.2005, 21:38
Вопрос задал: JStudent (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: sir henry
Здравствуйте, JStudent!
Со свойством Text все понятно, это я немного не въехал в вопрос - извиняюсь. :)
1. Попробуйте переписать запрос так:
SELECT * FROM data WHERE Trim(name)=:pName
2. Попробуйте обновить OLE провайдера
http://www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=6c050fe3-c795-4b7d-b037-185d0506396c
http://www.microsoft.com/downloads/details.aspx?FamilyID=2deddec4-350e-4cd0-a12a-d7f70a153156&DisplayLang=ru
К сожалению Вы не написали, какая у Вас БД. :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 14.04.2005, 06:12


Вопрос № 19666
Доброго времени суток.
Пояснение к вопросу №19603
Сразу скажу:
1. я неприкалываюсь.
2. по поводу DOWNTO я прекрасно осведомлен.
3. прошу обратить внимание while работает.
Запускаю цикл.
var fi:array[0..220]of real;
for i:=0 to 220 do
begin
fi[i] := 300;
end;
Я немного ошибся, i на первом же шаге принимает значение 221 и дальше пошла вниз по убывающей.
Далее, этот цикл не вложен в другой, в данном модуле у меня I используется несколько раз
для запуска циклов. В нескольких циклах та же проблема, в других нормально работает.
Думал, что I где-то присваевается другое значение, поэтому менял i на на новую переменную,
в тех же циклах та же проблема.
В то же время, меняю цикл for на while:
i:=0;
while i<101 do
begin
fi[i] := 300;
i:=i+1;
end;
Работает как надо.
Внимание, вопрос! Из-за чего такое явление имеет место быть?
Текст всей программы послать не могу, так как у меня там много собственных процедур и функций,
с ними легче запутаться чем разобраться.
Отправлен: 13.04.2005, 21:42
Вопрос задал: JStudent (статус: Посетитель)
Всего ответов отправлено: 4

Отвечает: John Freeman
Здравствуйте, JStudent!
Слушай , этот прикол ещё в Turbo Pascal был - выключи оптимизацию в свойствах проекта.
Ответ отправил: John Freeman (статус: Профессионал)
Отправлен: 13.04.2005, 22:51

Отвечает: wils0n
Здравствуйте, JStudent!
Читайте ответы Pushkin'a и ImDeath'a. Там всё сказано. Для проверки запустите что-нибудь вроде
for i:=0 to 220 do writeln(i);
или
for i:=0 to 220 do a[i]:=i;
Всё будет работать нормально.
Ответ отправил: wils0n (статус: 1-ый класс)
Отправлен: 13.04.2005, 23:11

Отвечает: sir henry
Здравствуйте, JStudent!
Если честно, то ситуация непонятная. Давайте начинать поиски с хвоста, за который можно ухватить. :)
Первый вопрос - откуда берется значение i:=221?
------------------
for i:=0 to 220 do
begin
WriteLn(i); {Здесь должно быть 0,1,2,3, и так далее, эксперименты это подтверждают :) !!!}
fi[i]:=300;
End;
------------------
Не путаются ли у Вас глобальная переменная i с локальной в какой-либо процедуре или функции?
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 14.04.2005, 05:52

Отвечает: Pushkin
Согласен, в твоем цикле FOR переменная i ИСПОЛЬЗУЕТСЯ, но с одной оговоркой, - она в левой части оператора :=. Попробуй поставить ее в правой части и все пойдет как надо. Например fi[i] := i+1;
Компилятор Delphi - довольно таки умная штука. Он смотрит, если от порядка изменения переменной цикла в выполнении программы ничего не изменится, то он делает код более быстрым. Сравни
1.
mov i,0
for1: inc i
cmp i,220
jnz for1
2.
mov i,220
for1: dec i
or i,i
jnz for1
Второй вариант занимает меньше места на 1-2 байта и выполняется быстрее на n*220 тактов, где n - зависит от типа переменной n. Чем больше размерность i, тем больше n.
Если что-то еще не понятно напиши весь цикл for (на эл. почту)
Ответ отправил: Pushkin (статус: 1-ый класс)
Отправлен: 14.04.2005, 13:05


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться

В избранное