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

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


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

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

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

Выпуск № 341
от 31.12.2005, 21:36

Администратор:Калашников О.А.
В рассылке:Подписчиков: 233, Экспертов: 51
В номере:Вопросов: 9, Ответов: 30


Вопрос № 32179: Здравствуйте! Подскажите в чем ошибка В ходе программы могут получиться пустые строки, я их хочу убрать. Пишу: if tabl.Cells[1,i]='' and tabl.Cells[2,i]='' then Tabl.RowCount:=Tabl.RowCount-1; На что мне пишут... [Error] Vvod...
Вопрос № 32183: Всем привет! Возник вопрос: в таблицу StringGrid ввожу координаты точек. А на Image.Canvas строятся окружности по этим координатам. Необходимо организовать такое дейстивие, что при выборе ячейки в таблице, окружность бы меняла свой цвет. Проб...
Вопрос № 32213: Здравствуйте уважаемые эксперты! Стыдно спрашивать такой простой вопрос, но придется: как эмулировать нажатие в системе клавиш CTRL+F ? Зарание спасибо! ...
Вопрос № 32214: Здравсвуйте! Пытаюсь заполнить таблицу из текстового фала 1.txt содержание которого следующее: 10 10 20 20 30 30 40 40 пишу: var Form1: TForm1; fname:string; f:TextFile; s,x,y:array of extended; <...
Вопрос № 32216: Всем привет! А кто знает, что если в редакторе кода зажать Alt и набрать 010 на цифровой клавиатуре, то появится список часто используемых синтаксических конструкций с возможностью вставки? Прикольно, правда? Случайно нашёл......
Вопрос № 32224: Здравствуйте! В каком порядке происходят события при создании и показе окна?...
Вопрос № 32226: Я не понимаю WinAPI. У вас не найдется книга или статья. Заранее спасибо...
Вопрос № 32227: Как программно 'открыть' TComboBox?...
Вопрос № 32238: Посоветуйте что-нибудь простое как Zippit (http://www.torry.net/samples/samples/compression/Zippit-0.0.1.zip), но для извлечения файлов из zip архива....

Вопрос № 32.179
Здравствуйте!
Подскажите в чем ошибка
В ходе программы могут получиться пустые строки, я их хочу убрать. Пишу:
if tabl.Cells[1,i]='' and tabl.Cells[2,i]='' then
Tabl.RowCount:=Tabl.RowCount-1;
На что мне пишут...
[Error] VvodXY.pas(145): Operator not applicable to this operand type
Как быть? :(
Отправлен: 25.12.2005, 23:36
Вопрос задала: Артемова Марина (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Маренич Владимир
Здравствуйте, Артемова Марина!
Вместо
if tabl.Cells[1,i]='' and tabl.Cells[2,i]='' then
напишите
if (tabl.Cells[1,i]='') and (tabl.Cells[2,i]='') then

Дело в том, что приоритет выполнения оператора AND выше сравнения (=,<,> и.т.д.). Поэтому компилятор пытался "склеить" '' и tabl... Вот и ругается, что низя такое клеить...

Удачи в изучении PASCAL :)
Ответ отправил: Маренич Владимир (статус: 9-ый класс)
Отправлен: 26.12.2005, 00:10

Отвечает: Schmak
Здравствуйте, Артемова Марина!
Ну дак правильно, что Delphi выдаёт ошибку, потому что правильно будет так:
if (tabl.Cells[1,i]='') and (tabl.Cells[2,i]='') then
ps. Хочу заранее предупредить что при удалении строк таким перебором следует использовать не for, а while или repeat..until, т.к. при удалении кол-во строк уменьшается => перебор нужно делать не до конца.
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 26.12.2005, 05:45

Отвечает: sir henry
Здравствуйте, Артемова Марина!
В Дельфи если у Вас приоритет операций другой, чем по умолчанию, необходимо ставить скобки. По умолчанию приоритет AND выше, чем приоритет операций сравнения, следовательно он выполняется в первую очередь. Сделайте так:
if (tabl.Cells[1,i]='') and (tabl.Cells[2,i]='')
тогда у Вас сначала выполнятся операторы в суобках (сравнение) а потом уже два выражения объеденятся по AND.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 26.12.2005, 06:41

Отвечает: Ерёмин Андрей
Здравствуйте, Артемова Марина!
Согласно правилам Object Pascal, при составлении сложных условий, состоящих из двух и более простых, простые условия следует брать в скобки:

if (tabl.Cells[1,i]='') and (tabl.Cells[2,i]='') then
Tabl.RowCount:=Tabl.RowCount-1;


---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 26.12.2005, 07:46


Вопрос № 32.183
Всем привет!
Возник вопрос:
в таблицу StringGrid ввожу координаты точек. А на Image.Canvas строятся окружности по этим координатам. Необходимо организовать такое дейстивие, что при выборе ячейки в таблице, окружность бы меняла свой цвет. Пробую это сделать с помощью On SelectCell в результате он дает ввести мне только первую точку и после этого вылетает программа с сообщением о плавающей точке. В чем ошибка?
Отправлен: 26.12.2005, 00:39
Вопрос задал: Lazut4ik (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Schmak
Здравствуйте, Lazut4ik!
Точки на канве имеют координаты целого типа, а раз вылетает ошибка операции с плавающей запятой, то скорее всего вы пытаетесь обратиться к точке с вещественными координатами, что конечно же недопустимо.

---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 26.12.2005, 05:49

Отвечает: sir henry
Здравствуйте, Lazut4ik!
А кто будет код приводить? Здесь мысли читать не умеют.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 26.12.2005, 06:44


Вопрос № 32.213
Здравствуйте уважаемые эксперты!

Стыдно спрашивать такой простой вопрос, но придется: как эмулировать нажатие в системе клавиш CTRL+F ?

Зарание спасибо!
Отправлен: 26.12.2005, 12:24
Вопрос задал: Lexus (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Lexus!
Используем API-функцию keybd_event:

keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event($46, 0, 0, 0);
keybd_event($46, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);


Не забывайте при этом, что данный код имитирует нажатие комбинации Ctrl+F на клавиатуре и передано оно будет активному приложению, поэтому, если вы хотите посылать нажатие другому окну, нужно его сначала активировать.
---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 26.12.2005, 13:07
Оценка за ответ: 5

Отвечает: Rusland
Здравствуйте, Lexus!
Проблема только в эмуляции нажатия клавиш? Тогда смотрите код в приложении.

Приложение:

---------
Пресловутое недостающее звено между обезьяной и цивилизованным человеком - это как раз мы. (Конрад Лоренц)

Ответ отправил: Rusland (статус: Специалист)
Отправлен: 26.12.2005, 13:07
Оценка за ответ: 5

Отвечает: Лучников Юрий Владимирович
Здравствуйте, Lexus!

Думаю посылкой MESSAGE нужному оконному объекту;)

Успехов!

--
Советую плотнее общаться с MSDN (msdn.microsoft.com) ;)
Ответ отправил: Лучников Юрий Владимирович (статус: 7-ой класс)
Отправлен: 26.12.2005, 16:35
Оценка за ответ: 3


Вопрос № 32.214
Здравсвуйте!
Пытаюсь заполнить таблицу из текстового фала 1.txt содержание которого следующее:
10 10
20 20
30 30
40 40
пишу:
var
Form1: TForm1;
fname:string;
f:TextFile;
s,x,y:array of extended;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
fname:=OpenDialog1.FileName;
assignfile(f,fname);
reset(f);
SetLength(x,Length(x)+1);
SetLength(y,Length(y)+1);
SetLength(s,Length(s)+1);
i:=0;
while not EOF(f) do
begin
read(f,s[i]);
if frac(i/2)=0 then
begin
x[i]:=s[i];
tabl.Cells[0,i+1]:=floattostr(x[i]);
end
else
begin
y[i]:=s[i];
tabl.Cells[1,i+1]:=floattostr(y[i]);
end;
inc(i);
end;
end;
end;

Выдает ошибку:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0045D74C.....
В чем может быть дело?
Отправлен: 26.12.2005, 12:43
Вопрос задала: Артемова Марина (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Zubex
Здравствуйте, Артемова Марина!
Ой! Зачем такие сложности?... Три динамических массива для того, чтобы заполнить StringGrid... Это чересчур!!!
Делайте так (приложение)

Теперь по Вашему коду:
1. SetLength(...,Length(...)+1) надо делать в каждом витке цикла;
2. По окончании заполнения таблицы следовало бы закрыть файл: CloseFile(f);

Приложение:

---------
Если не знаешь что сказать - лучше промолчи...

Ответ отправил: Zubex (статус: 4-ый класс)
Отправлен: 26.12.2005, 13:21

Отвечает: sir henry
Здравствуйте, Артемова Марина!
1. Ошибка, скорее всего, здесь:
Length(x)
У вВас еще память под массив не выделена, а Вы уже пытаетесь его длину получить и вдобавок прибавить к несуществующей цифре еденицу.
2. Вы пользуетесь переменными, которые не объявили (i).
3. У Вас данные в файли типа Integer, зачем для их считывания Вы используете тип Extended?
Ответ отправил: sir henry (статус: Академик)
Отправлен: 26.12.2005, 13:21

Отвечает: Ерёмин Андрей
Здравствуйте, Артемова Марина!
Честно говоря, странный у вас код... Много всего лишнего. Можно обойтись и без использования динамических массивов, сократив длину самого кода в два раза:

var
Form1: TForm1;
fname:string;
f:TextFile;
i: integer;
tmp: real;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
fname:=OpenDialog1.FileName;
assignfile(f,fname);
reset(f);
i:=0;
while not EOF(f) do
begin
read(f,tmp);
tabl.Cells[0,i]:=floattostr(tmp);
read(f,tmp);
tabl.Cells[1,i]:=floattostr(tmp);
inc(i);
end;
closefile(f);
end;
end;


Не забудьте, что перед этим в StringGrid должны быть соответствующие ячейки (свойства ColCount и RowCount).
---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 26.12.2005, 13:56

Отвечает: Schmak
Здравствуйте, Артемова Марина!
Зачем так сложно? По-моему так легче, а результат, я думаю, тот самый:
var
fname:string;
f:TextFile;

procedure TForm1.Button1Click(Sender: TObject);
var a,b:Extended;
i:integer;
begin
if OpenDialog1.Execute then
begin
fname:=OpenDialog1.FileName;
assignfile(f,fname);
reset(f);
i:=0;
while not EOF(f) do
begin
read(f,a,b);
if tabl.RowCount=i then tabl.RowCount:=i+1;
tabl.Cells[0,i]:=floattostr(a);
tabl.Cells[1,i]:=floattostr(b);
inc(i);
end;
closefile(f);
end;
end;

end.

PS Кстати лучше занести объявление текстового файла в обработчик событий.
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 26.12.2005, 16:40

Отвечает: Jadd
Здравствуйте, Артемова Марина!
if frac(i/2)=0 then
begin
x[i]:=s[i];
tabl.Cells[0,i+1]:=floattostr(x[i]);
end
else
begin
y[i]:=s[i];
tabl.Cells[1,i+1]:=floattostr(y[i]);
end;

тут нужно проверять на предмет выхода значения i за пределы массива, т.е. if (i+1) = Length(s) then и не обрабатывать эту итерацию или не делать операции с элементом массива i+1.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 26.12.2005, 16:49


Вопрос № 32.216
Всем привет!
А кто знает, что если в редакторе кода зажать Alt и набрать 010 на цифровой клавиатуре, то появится список часто используемых синтаксических конструкций с возможностью вставки? Прикольно, правда? Случайно нашёл...
Отправлен: 26.12.2005, 13:25
Вопрос задал: Ерёмин Андрей (статус: Профессионал)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Zubex
Здравствуйте, Ерёмин Андрей!
Точно прикольно, попробовав, нашел еще:
Alt + 06 - поиск;
Alt + 018 - замена;
А список часто используемых синтаксических конструкций вызывается также CTRL + J

---------
Если не знаешь что сказать - лучше промолчи...
Ответ отправил: Zubex (статус: 4-ый класс)
Отправлен: 26.12.2005, 13:43
Оценка за ответ: 5
Комментарий оценки:
Не сомневаюсь, что в Delphi ещё полно пасхалок. Ещё есть специальный параметр, запустив delphi32.exe с которым, вместо обычного логотипа загрузки будет фотография разработчиков. ;)

Отвечает: REFERI
Здравствуйте, Ерёмин Андрей!
Читал про такое - только смысл в этом немножко другой - это не для того сделано чтобы часто используемые конструкции выводить, а как средство автоматизации - автозаполнение. Например пишем tr затем жмем комбинацию и появляются варианты - нажимаем Enter и вся конструкция расписана! Такое и в билдере тоже по-моему есть...
А вообще по этому поводу не мешало бы создать ветку в форуме что-ли...
Потому сам тоже часто нахожу к-нить интересные фишки и хочется поделиться этим с другими читателями, но в вопрос это посылать как-то неуместно. Так что
давайте все сливать на форум!
До встречи!
---------
Не судите, да не судимы будете...
Ответ отправил: REFERI (статус: Студент)
Отправлен: 26.12.2005, 23:19
Оценка за ответ: 5
Комментарий оценки:
Вот я и создал вчера рассылку... :) Читайте в новостях.


Вопрос № 32.224
Здравствуйте!
В каком порядке происходят события при создании и показе окна?
Отправлен: 26.12.2005, 15:19
Вопрос задал: SuperXakep (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Dushin Igor
Здравствуйте, SuperXakep!
Если я правильно понял вопрос, то вот так:
onCreate
onShow
onPaint
onActivate
onResize
onPaint(снова!)
---------
Старый глюк лучше новых двух!
Ответ отправил: Dushin Igor (статус: 1-ый класс)
Отправлен: 26.12.2005, 15:26
Оценка за ответ: 5

Отвечает: Ерёмин Андрей
Здравствуйте, SuperXakep!
Вот в таком порядке:

OnCreate
OnShow
OnPaint
OnActivate
OnResize
OnPaint

---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 26.12.2005, 15:36
Оценка за ответ: 5

Отвечает: sir henry
Здравствуйте, SuperXakep!
Примерно в таком:
- OnCreate
- OnShow
- OnPaint
- OnActivate
- OnResize
- OnPaint
Ответ отправил: sir henry (статус: Академик)
Отправлен: 26.12.2005, 15:51
Оценка за ответ: 5

Отвечает: Schmak
Здравствуйте, SuperXakep!
Если не ошибаюсь, то так:
OnCreate
OnShow
OnPaint
OnActivate
OnResize
OnPaint
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 26.12.2005, 16:40


Вопрос № 32.226
Я не понимаю WinAPI. У вас не найдется книга или статья. Заранее спасибо
Отправлен: 26.12.2005, 15:55
Вопрос задал: E.T.T (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ерёмин Андрей
Здравствуйте, E.T.T!
Что именно вам непонятно? API (Application Programming Interface) - это функции, которые можно использовать в любом языке программирования, т.к. берутся они из Windows. Справочник по API-функциям есть и в дистрибутиве Delphi:
Пуск - Программы - Borland Delphi - Help - MS SDK Help Files - Win32 SDK Reference.
---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 26.12.2005, 16:02
Оценка за ответ: 1

Отвечает: sir henry
Здравствуйте, E.T.T!
Это очень большая книга (три CD-ROM'а), поэтому ни о какой статье и речи быть не может. Вот ссылка:
http://msdn.microsoft.com
Лучше сходить на барахолку и купить диски.
Русская версия, очень убогая, но как справочник годится:
http://www.softodrom.ru/win/ap/p3218.shtml
Ответ отправил: sir henry (статус: Академик)
Отправлен: 26.12.2005, 16:32

Отвечает: Zubex
Здравствуйте, E.T.T!
Советую почитать Джеффри РИХТЕР "Windows для профессионалов".
Когда поймете как работает Windows, тогда и Win-API поймете...
---------
Если не знаешь что сказать - лучше промолчи...
Ответ отправил: Zubex (статус: 4-ый класс)
Отправлен: 26.12.2005, 17:49
Оценка за ответ: 3

Отвечает: Сазонов Михаил Владимирович
Здравствуйте, E.T.T!
У меня есть книга Румянцева (в формате PDF 18 М). Мыльте мне я ее вышлю Вам.
Ответ отправил: Сазонов Михаил Владимирович (статус: 1-ый класс)
Отправлен: 27.12.2005, 09:37


Вопрос № 32.227
Как программно 'открыть' TComboBox?
Отправлен: 26.12.2005, 16:08
Вопрос задал: SuperXakep (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Rusland
Здравствуйте, SuperXakep!
См. приложение

Приложение:

---------
Пресловутое недостающее звено между обезьяной и цивилизованным человеком - это как раз мы. (Конрад Лоренц)

Ответ отправил: Rusland (статус: Специалист)
Отправлен: 26.12.2005, 16:13
Оценка за ответ: 5

Отвечает: Ерёмин Андрей
Здравствуйте, SuperXakep!
Есть специальное свойство - DroppedDown:

ComboBox1.DroppedDown:=True;


---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 26.12.2005, 16:14
Оценка за ответ: 5

Отвечает: Dushin Igor
Здравствуйте, SuperXakep!
Для открытия ComboBox используйте:
ComboBox1.DroppedDown := True
Что бы закрыть:
ComboBox1.DroppedDown := False
---------
Старый глюк лучше новых двух!
Ответ отправил: Dushin Igor (статус: 1-ый класс)
Отправлен: 26.12.2005, 16:28
Оценка за ответ: 5

Отвечает: Schmak
Здравствуйте, SuperXakep!
Свойству ComboBoxа DroppedDown присвойте True:
ComboBox1.DroppedDown:=True;
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 26.12.2005, 16:40
Оценка за ответ: 5


Вопрос № 32.238
Посоветуйте что-нибудь простое как Zippit
(http://www.torry.net/samples/samples/compression/Zippit-0.0.1.zip), но для извлечения файлов из zip архива.
Отправлен: 26.12.2005, 19:17
Вопрос задал: 34076 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Rusland
Здравствуйте, 34076!
Попробуйте компонент ZipForge (http://www.componentace.com/zip_component_zip_delphi_zipforge.htm). Удачи.
---------
Пресловутое недостающее звено между обезьяной и цивилизованным человеком - это как раз мы. (Конрад Лоренц)
Ответ отправил: Rusland (статус: Специалист)
Отправлен: 27.12.2005, 10:51
Оценка за ответ: 5

Отвечает: Лучников Юрий Владимирович
Здравствуйте, 34076!

Поищи хороший компонент ZipForge.

Успехов;)
Ответ отправил: Лучников Юрий Владимирович (статус: 7-ой класс)
Отправлен: 27.12.2005, 11:03
Оценка за ответ: 5


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное