Здравствуйте, уважаемые эксперты. У меня проблема с написанием компонентов для Delphi 6. Есть два компонента (см. приложение). Я устанавливаю на форму эти компоненты и с помощью свойства FMain привязываю компонент TDicView к компоненту TMain. После этого все работает. Но если удалить с формы компонент TMain, то Delphi выдает ошибку в какой-то библиотеке RTL60.BPL Даже доходит до того, что все виснет. Я так понимаю, что в компоненте TDicView где-то остается ссылка на удаленный компонент, но как это убрать я не знаю. Что можете посоветовать?
Эта ситуация достаточно подробна рассмотрена в документации (раздел TComponent.Notification). Проще говоря, твой компонент будет уведомлен о каком-либо событии, связанном с другим компонентом, если твой компонент предварительно об этом попросит. Для этого используются метод FreeNotification и переопределяется метод Notification. Пример можешь взять в исходниках VCL (все манипуляции с FPopupMenu класса TControl). Такие действия ты должен делать всякий раз, когда связываешь два компонента.
Приложение: Ответ отправлен: 24.06.2003, 15:47 Отправитель: Артём Шегеда Отвечает ART_43
Здравствуйте, Eugene! Попробуй убрать "if main <> nil then" Ответ отправлен: 24.06.2003, 10:18 Отправитель: ART_43
Вопрос № 750
Hi, это снова я. Еще один вопрос: как в своих компонентах вызывать свои же формы. У меня они почему-то равны nil.
Доброе время суток, Eugene! 1. Подключить unit, в котором описан класс формы. 2. Создать переменную данного класса. 3. Сделать с ней все, что нужно. 4. Удалить переменную. ...
Uses UMyForm; var f : TMyForm; ... begin f := TMyForm.Create (self); ... f.ShowModal (); f.Free (); end;
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 24.06.2003, 22:22 Отправитель: Bob Johnson
Вопрос № 751
Добрый день! Вопрос у меня такой: Допустим есть у меня файл. А мне не нужны его последние 10 байт. Как можно урезать размер этого файла?
Приветствую Вас, Silver! Создайте новый временный файл, перенесите туда нужные байты, а затем замените им страрый. Функций, позволяющих это сделать напрямую, насколько мне известно, нет! Ответ отправлен: 24.06.2003, 15:57 Отправитель: Pin Отвечает Gefest
Добрый день, Silver! Можно сделать так: var f: file of byte; str: string; i: integer; begin AssignFile(f, 'MyFile.exe'); reset(f); Seek(f, FileSize(f)-10); for i:=1 to 10 do Read(f, str[i]); Seek(f, 0); Truncate(f); // Отсекает все что после указателя в файле for i:=1 to 10 do Write(f, str[i]); Close(F); end; Еще можно определит f: file; тогда придется описывать динамическую переменную. Получится скорость выше, но это менее интересно. Больше вроде никак нельзя. Ответ отправлен: 24.06.2003, 15:26 Отправитель: Gefest Отвечает vitya
Приветствую Вас, Silver! Я не знаю под какую ось вы это делате. Под Виндовс это делается так: ::SetFilePointer()... на то место где должен быть конец файла ::SetEndOfFile()... этим перемещаем маркер конца файла в данную точку. Ответ отправлен: 24.06.2003, 14:03 Отправитель: vitya Отвечает URiS
Приветствую Вас, Silver! Интересный вопрос. Решения: 1) Если они тебе не нужны, не используй их! :8) 2) Изучай FAT32, затем уменьшишь размер файла на 10 байт напрямую. 3) "Урезать" всё равно не получится. 4) Можно скопировать size-10 байт файла F1 в файл F2. Затем удаляешь F1 и переименовываешь F1 в F2. В итоге у тебя прежний файл без последних 10 байт.
Ответ отправлен: 24.06.2003, 20:35 Отправитель: URiS Отвечает Bob Johnson
Добрый день, Silver! Можно вначале установить указатель на 10-й байт с конца (SetFilePointer и FILE_END), прочитать из него эти самые 10 байт и перезаписать его.
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 24.06.2003, 22:22 Отправитель: Bob Johnson
Вопрос № 752
Здравствуйте уважаемые эксперты! Расскажите, пожалуйста, как в Delphi программно поместить свою иконку в SystemTray, и создать там для нее меню. Заранее благодарен.
Здравствуйте, Vopros! Есть такой модуль - TRAYICON.PAS. Через него это и делается. У меня он есть. Если тебя это устраивает, то обращайся: urisff@inbox.ru Обязательно вышлю.
Ответ отправлен: 25.06.2003, 13:34 Отправитель: URiS Отвечает Bob Johnson
Добрый день, vopros! Для этого надо использовать API функцию Shell_NotifyIcon (NIM_ADD, ...). Более подробно о том, как заполнять структуру и получать уведомления о действии пользователя см. в Win32 Developer's reference (есть в помощи от Delphi) или в MSDN. Найти раздел можно по функции. Кстати, System Tray - неправильное название. Правильно будет Taskbar Notification Area!
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 24.06.2003, 22:22 Отправитель: Bob Johnson
Вопрос № 753
Эксперты, к Вам взываю!!! ;) Не знает ли кто-нибудь, как можно получить из-под Win температуру процессора? Датчик у меня стоит. BIOS отображает температуру проца, матери и скорость кулера в RPM. Спасибо!
Привет, =FeanaR=! :) Как делишки? Проблемы с охлаждением? Сделать универсальную(работающую на всех компьютерах) программу всё равно не получится. Я так понимаю, тебе это только для себя. 1. Обработка(получение/реакция) температуры - это задача системной платы. К современным СП прилагаются специальные программы для слежения за температурой, а также для разгона прямо из под Windows(R). Можно попытаться найти такую программу для своей системной платы на сайте её производителя. 2. Есть ещё один выход. Недавно скачал статью Tirgan'а о работе с портами. Там было что-то вроде термометра и как с ним работать через порт: http://kalaidjian.narod.ru/proekt.rar
Ответ отправлен: 25.06.2003, 13:34 Отправитель: URiS Отвечает Bob Johnson
Здравствуйте, =FeanaR=! Запустить специальную программу, которая это показывает. Или тебе надо внутри своей программы? Ну тогда ищи описание, как программировать микросхему контроллера PC Health на твоей плате.
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 26.06.2003, 17:38 Отправитель: Bob Johnson
Вопрос № 754
Ув. эксперты, есть некая структура типа record. В ней есть несколько полей. Необходимо узнать смещение каждого из полей относительно начала структуры и представить его в виде integer. При это нельзя обьявлять экземпляр структуры в виде var-переменной, а необходимо ссылаться только на описание структуры. Нельзя также просчитывать смещение вручную. Delphi5. Спасибо.
Ответ отправлен: 25.06.2003, 13:34 Отправитель: URiS Отвечает Дима Мусиенко
Добрый день, s17! Страноватый вопрос. Вообще рекомендую поиграться с отладчиком, объяви экземпляр записи, узнай её адрес и посмотри по-этому адресу дамп памяти. Или что тебе мешает программно вычислить адреса полей записи. < Нельзя также просчитывать смещение вручную Это как понять, вручную. (в уме или программно) Не знаю, как Дельфи располагает в памяти записи. Но в C++, по-моему, размещение линейное, т.е. r = record a: integer; адрес = адрес r (может быть я ошибаюсь) b: byte; адрес = адрес r + 4 end;
Приложение: Ответ отправлен: 26.06.2003, 10:37 Отправитель: Дима Мусиенко Отвечает Bob Johnson
Доброе время суток, s17!
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 26.06.2003, 17:37 Отправитель: Bob Johnson
Вопрос № 755
Здравствуйте, эксперты. 1) Помогите разобраться с ошибкой. Пытаюсь из текстового файла File.txt с названиями городов (примерно 200 городов) занести эти названия в базу данных, но выдается ошибка "Key Violation" и все тут (см. приложение). 2) Вот начинаю изучать SQL, но проблема в том, что моя книга посвящена только TTable, а про ТQuery упоминается только иногда. Я хотел только узнать - ТQuery используется как и TTable по "одиночке" или же совместно ??? Помогите ПОЖАЛЙСТА, ну о-о-очень нужно! Всем заранее спасибо. С уважением SATAN aka NAPALM.
Доброе время суток, SATAN aka NAPALM! 1. Эта ошибка может означать попытку занесения недопустимого значения в ключевое поле таблицы или что-то похожее. Я всегда пользовался SQL-вариантом, см. ниже. 2. TQuery используется вместо TTable. Трудности могут возникнуть только при попытке изменения записей или добавления новых, если ты делаешь это обычным DBGrid. А вообще с TQuery надо работать так: q.SQL.Text = 'select * from table1'; q.Open; = q.FieldByName ('...').AsInteger; ...
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 27.06.2003, 02:04 Отправитель: Bob Johnson
Вопрос № 756
Здравствуйте, многоуважаемые эксперты, еще раз !!! 1) Есть база по сотрудникам организации. А как можно узнать сколько сотрудников с профессией например плотник, слесарь и т.д. Если бы мне были известны все эти профессии, то проблем бы не было, но мне же не известно какие именно профессии будут заноситься в базу ??? 2) А что такое манифест ? Я видел файл с таким расширением, а там xml-текст, для чего он нужен я так и не разобрался :(. Подскажите плз. Всем заранее спасибо. С уважением SATAN aka NAPALM.
Добрый день, SATAN aka NAPALM! 1) Тебе и не нужно знать, какие профессии будут в базе. Просто нужно например, занести в список все профессии, юзер выбирает нужную, дальше вычисляется сколько записей с такой-то профессией. Примерно так. Ответ отправлен: 26.06.2003, 10:17 Отправитель: Дима Мусиенко Отвечает Vdr
Добрый день, SATAN aka NAPALM! У тебя проблема с запросом? Если так, то надо знать какие поля есть в таблице... Тогда можно и запрос составить. Расширь вопрос. Удачи! Ответ отправлен: 25.06.2003, 19:01 Отправитель: Vdr Отвечает URiS
Приветствую Вас, SATAN aka NAPALM! 1) Следующий алгоритм: - Имеем (число профессий не больше сотни): A: array[1..100] of string; b: array[1..100] of word; index, procount: word = 0; - Поочерёдно считываем профессии: Проверяем, есть ли эта профессия в массиве A. Если нет, то увеличиваем PROCOUNT, заносим её в A[procount] и увеличиваем b[procount] на 1 (b[procount]:=b[procount]+1;). Если есть, то ищем индекс ячейки (index), в которой она находится, и делаем b[index]:=b[index]+1; Теперь в procount мы имеем количество уникальных профессий и можем вывести профессии и их количество на экран: for i:=1 to procount do Writeln(a[i],' = ',b[i]);
Ответ отправлен: 26.06.2003, 11:09 Отправитель: URiS Отвечает Артём Шегеда
Добрый день, SATAN aka NAPALM!
Это чистый SQL.
select distinct count(prof),prof from workers_table group by prof
В этом запросе выбирается число профессий и названия профессий из таблицы workers_table. Ответ отправлен: 25.06.2003, 14:01 Отправитель: Артём Шегеда Отвечает Bob Johnson
Здравствуйте, SATAN aka NAPALM! 1. Вначале получи из базы все различные варианты профессий (если не будет отдельной таблицы для этого, можно воспользоваться select distinct), а тогда уже формируй требуемый запрос. 2. Это файл, где указаны некоторые требования программы к ОС. В ХР такой файл позволяет использоваться common controls версии 6 и получить таким образом внешний вид в стиле "ХР".
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 27.06.2003, 02:04 Отправитель: Bob Johnson
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.