Вопрос № 28471: Приветствую всех. Как можно определить тип EXE файла, т.е. это DOS приложение, Win16 (не знаю было ли там деление на консольные и GUI, если было, то это тоже надо знать). С Win32 там все понятно. Поковырявшись немного в исходниках Resource Explorer-а...Вопрос № 28478: Здравствуйте уважаемые эксперты и подписчики рассылки.
У меня возникла небольшая проблема.
Как сделать, чтобы при нажатии на кнопку в компонент PopupMenu добавлялись новые пункты – Caption которых брался из списка, которых хранится в текстово...Вопрос № 28490: Здравствуйте уважаемые эксперты!
У меня следующие вопросы, очень нужна ваша помощь:
1. Необходимо выдернуть инфу о материнке и процике из отчетов таких программ, как Everest и Aida (лучше Everest);
2. Есть таблица, я использую DBGridEh, в...Вопрос № 28496: Здравствуйте уважаемые эксперты.
1).Такая вот маленькая проблемка: как сделать, чтобы после выполнения какой либо функции на метке появлялась, а затем через три секунды исчезала надпись. Попробовал так :
Label2.Caption := 'Сделано';
Sl...Вопрос № 28497: Привет. Есть программа Netlook, но сетевые ресурсы она открывает експлорером. Если поставить открывать с помощью программы и эта программа сама должна запускаться с параметрами, то открытия ресурсов не происходит (не может справиться с двумя и более ...
Вопрос № 28.471
Приветствую всех. Как можно определить тип EXE файла, т.е. это DOS приложение, Win16 (не знаю было ли там деление на консольные и GUI, если было, то это тоже надо знать). С Win32 там все понятно. Поковырявшись немного в исходниках Resource Explorer-а, из состава Delphi 7 все стало ясно, а DOS и Win16 ничего не ясно. Подскажите, пожалуйста.
Отвечает: Romodos
Здравствуйте, AlexAnder2k5!
В Win16 приложение должна быть сигнатура 454Eh. (т.е в коде надо искать 4E 45)
Эти биты в ASCII кодировке будут выглядеть как NE.
Поэтому Win16 файлы и называют NE, а Win32 - PE.
В DOS приложении должна быть сигнатура 5A4Dh. (т.е в коде надо искать 4D 5A)
Это первые два байта.
Эти биты в ASCII кодировке будут выглядеть как MZ
Поэтому DOS приложения называют MZ.
--------- FAQ me off!
Ответ отправил: Romodos (статус: Студент)
Отправлен: 29.10.2005, 07:53
Отвечает: sir henry
Здравствуйте, AlexAnder2k5!
Как бы это помягче выразиться, чтобы Вас не расстроить? :)
Дело в том, что форматы исполняемых файлов совершенно к разделу Дельфи не относятся. Дельфи всегда создает файл только одного вида - РЕ.
Если коротко пробежаться по форматам, то в начале ЛЮБОГО файла ВСЕГДА присутствует досовские заголовок, который начинается с букв MZ. Изредка там стоит ZM. Какие компиляторы этим балуются я не знаю, но имейте в виду. :)
Для файлов win16 прибавляется дополнительный заголовок - NE.
Если по смещению 0018h в заголовке MZ содержиться значение 40h, то этот файл виндовый (или win16 или win32). После этого нужно найти адрес начала второго заголовка. Он находится по смещению 003Ch. Допустим в этой ячейке стоит 400. Тогда переходим на 0400h. Если там стоит NE - это для win16, если PE - для win32.
В win16 были только GUI приложения. Консольные ничем от досовских не отличались.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.10.2005, 08:03
Вопрос № 28.478
Здравствуйте уважаемые эксперты и подписчики рассылки.
У меня возникла небольшая проблема.
Как сделать, чтобы при нажатии на кнопку в компонент PopupMenu добавлялись новые пункты – Caption которых брался из списка, которых хранится в текстовом файле. Процедура для всех новых пунктов одна и та же, но необходимо получить для нее Caption пункта меню по которому кликнули. Изначально в этом PopupMenu уже существуют 3 пункта. При каждом клике по кнопке список пунктов должен обновляться. Другими словами нужно что-то похожее на меню избранное в IE с вышеуказанными параметрами. Я просто довожу до ума свой
IRC клиент (http://source.at.tut.by/instruments.exe) – решил в него добавить пункт Избранное, но вот застрял на создании пунктов меню :).
Отправлен: 29.10.2005, 04:36
Вопрос задал: source (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: sir henry
Здравствуйте, source!
Это можно сделать с помощью функции:
AppendMenu(hMenu: HMENU; uFlags, uIDNewItem: UINT; lpNewItem: PChar): BOOL;
где
hMenu - хэндл Вашего меню;
uFlags - специфические флаги пункта меню. Флагов довольно много, посмотрите сами в хелпе;
uIDNewItem - идентификатор (номер) пункта меню;
lpNewItem - надпись.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.10.2005, 08:18
Отвечает: Schmak
Здравствуйте, source!
Добавьте в раздел private нужной формы (в примере Form1) объявление процедуры
procedure ItemClick(sender:Tobject);
А затем вставьте код из примера. Естественно, что я не стал приводить загрузку из файла и собственно выполняемое действие.
Приложение:
Ответ отправил: Schmak (статус: 5-ый класс)
Отправлен: 29.10.2005, 10:42
Вопрос № 28.490
Здравствуйте уважаемые эксперты!
У меня следующие вопросы, очень нужна ваша помощь:
1. Необходимо выдернуть инфу о материнке и процике из отчетов таких программ, как Everest и Aida (лучше Everest);
2. Есть таблица, я использую DBGridEh, вообщем есть некоторая запись, как в одну ячейку добавить несколько строк?
3. Мне нужно для нашей организации написать, программку по инвентаризации ПК, мож кто с этим сталкивался, есть какие-нибудь исходники, ссылки, мысли, идеи, компоненты, приветствую любую помощь. Ссылки на готовые программы не предлагать. Сколько не находил, везде очень много каши. Мне нужно инфу собрать, а у нас 136 компьютеров (процессор, память, HDD, материнка, CD-Rom, видео, сеть, монитор, принтер, ксерокс, сканер и соответственно инв. номера на системник, монитор, принтер...).
Заранее спасибо за проявленную помощь.
Отправлен: 29.10.2005, 12:10
Вопрос задал: xXx (статус: 5-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Werewolf
Здравствуйте, xXx!
1. Ищите компоненты отображающие информацию о системе в т. ч. о материнке и процике
2. Поставте dbgrideh.rowSizingAllowed в true, а затем DBGridEh1.DataSource.DataSet.AppendRecord(['fdhsh'#13#10'dggbdsg'#13#10'=)']);
3. См. п. 1
Удачи.
Ответ отправил: Werewolf (статус: Студент)
Отправлен: 29.10.2005, 12:29
Отвечает: sir henry
Здравствуйте, xXx!
1. Во-первых нужно знать, в каком формате Вы сохранили отчет. У меня стоит AIDA, так вот она предлагает форматы: HTML, текстовый, XML, CSV, INI и т.п. В зависимости от того, в каком формате Вы сохраните отчет и будет зависеть способ его "распотрошения". :)
2. В свойстве TColumnEh.WordWrap надо поставить True, тогда длинная строка будет переносится автоматом.
3. Никаких идей кроме стандартных, о том, что надо определить, какие данные Вы будете собирать и обрабатывать, здесь подсказать трудно. Об этом полностью забит интернет и всевозможные учебники по БД.
Нужно составить таблицы-справочники, где будет вестись учет названий техники, составить оперативные таблицы, где будет вестись учет количества техники и зделать шаблоны отчетов, которые Вам понадобятся.
Лучшев всего будет Вам купить книжку по работе с БД.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.10.2005, 15:14
Вопрос № 28.496
Здравствуйте уважаемые эксперты.
1).Такая вот маленькая проблемка: как сделать, чтобы после выполнения какой либо функции на метке появлялась, а затем через три секунды исчезала надпись. Попробовал так :
Label2.Caption := 'Сделано';
Sleep(3000);
Label2.Caption := '';
но программа зависает как раз ровно на 3 секунды и с меткой ничего не происходит.
2). Процедура sleep объявлена как в модуле SysUtils, так и в модуле Windows:
Unit SysUtils
Syntax [Delphi] procedure Sleep(milliseconds: Cardinal);
Unit Windows
Syntax [Delphi] procedure Sleep(dwMilliseconds: Cardinal);
Мне интересно из какого же модуля она вызывается? (по умолчанию объявлены оба модуля)
Отправлен: 29.10.2005, 15:15
Вопрос задал: Teapot (статус: Посетитель)
Всего ответов: 9 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Jadd
Здравствуйте, Teapot!
Очень просто. Два варианта. Первый. Размещаешь на форме TTimer и при завершении какой-то функции просто активируешь таймер, а тот, по истечении 3-х секунд сам себя деактивирует и стирает надпись. Способ Второй. Он схож с первым, но тут не размещаешь, а в коде создаешь объект типа TTimer и присваиваешь ему собственный обработчик события OnTimer. Третий способ. Ловишь сообщение винды WM_TIMER и делаешь то же самое.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 29.10.2005, 15:25 Оценка за ответ: 4 Комментарий оценки: Thanks
Отвечает: Schmak
Здравствуйте, Teapot!
Можно вставить перед Sleep строчку
Application.ProcessMessages;
Метка при этом изменяется, но приложение всё равно подвисает, поэтому лучше использовать Timer:
1) В таймере выставляете нужную Вам задержку, в обработчике OnTimer:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label2.Caption := '';
Timer1.enabled:=False;
end;
2) В функции просто запускаете таймер.
Ответ отправил: Schmak (статус: 5-ый класс)
Отправлен: 29.10.2005, 15:47
Отвечает: Romodos
Здравствуйте, Teapot!
Можно на форму кинуть таймер с interval=3000;
и писать в ontimer
label2.caption:='Сделано';
timer1.enabled:=false;
--------- FAQ me off!
Ответ отправил: Romodos (статус: Студент)
Отправлен: 29.10.2005, 15:53
Отвечает: Denis Hakimov
Здравствуйте, Teapot!
2) Вызывается из того модуля, который позже объявлен! :) Такая же ситуация с функцией Beep, есть 2 версии этой функции - первая в SysUtils, вторая в Windows. Если написать
uses SysUtils,...,Windows;
, то будет вызвана вторая функция (по умолчанию вызывается первая).
1) добавте таймер на форму, поменяйте свойство Interval таймера на 3000, затем создайте обработчик события OnTimer, в котором и изменяйте
Label2.Caption := '';
Затем при выполнении Вашей функции сначала поменяйте заголовок Label2.Caption := 'Сделано';
а после включите таймер
Timer1.Enable:=True;
код в приложении.
Удачи!
Приложение:
Ответ отправил: Denis Hakimov (статус: 4-ый класс)
Отправлен: 29.10.2005, 16:22 Оценка за ответ: 5 Комментарий оценки: Спасибо за первый полный ответ
Отвечает: Denisss Здравствуйте, Teapot!
1. Есть два (ну и более) способа решения проблемы:
1) перед sleep(3000) вызвать процедуру Application.ProcessMessages;
тогда на метке будет высвечиваться текст, программа будет подвисать на 3 секунды, а после трех секунд будет очищать метку.
2) установить таймер с интервалом 3000 (3 сек). после Label2.Caption := 'Сделано'; прописать Timer.Enabled:= True;
В самом таймере сделать так:
Timer.Enabled:= False;
Label2.Caption := '';
2. Узнать откуда вызывается функция Sleep легко - наведите на него мышкой и удерживайте до получения всплывающей подсказки.
Обычно, если функция встречается дважды в двух разных модулях, то используется та функция, модуль которой встречается позже в uses. (Т.е. скорее всего у Вас функция sleep вызывается из модуля SysUtils).
Аналогично работает класс Tbitmap, который встречается в модулях Windows и Graphics.
Если Вам необходимо использовать процедуру из определенного модуля, то используйте его так:
Windows.Sleep(3000);
либо
SysUtils.Sleep(3000);
Удачи!
Ответ отправил: Denisss (статус: Практикант)
Отправлен: 29.10.2005, 16:53 Оценка за ответ: 5
Отвечает: sir henry
Здравствуйте, Teapot!
1) Скорее всего метка просто не успевает изменится, т.к. программа сразу же засыпает на 3 сек.
Сделайте так, тогда прежде чем заснуть, программа обновит метку:
label2.Caption:='Сделано!';
Application.ProcessMessages;
sleep(3000);
label2.Caption:='';
Можно вместо Sleep() использовать таймер.
label2.Caption:='Сделано!';
Timer1.Enabled:=True;
Таймер запустится, а в событии OnTimer должно стоять его выключение:
label2.Caption:='';
Timer1.Enabled:=False;
Время работы (3секунды) выставляете:
Timer1.Interval:=3000;
2) А Вам не все равно? Это одна и таже функция, которая берется из kernel32.dll.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.10.2005, 17:11 Оценка за ответ: 4 Комментарий оценки: >>А Вам не все равно? Это одна и таже >>функция, которая берется из kernel32.dll. Если б знал не задавал бы вопроса.
Отвечает: Delphin
Здравствуйте, Teapot!
Имя TeaPot = Чайник ? :D
Sleep(); Вешает твою программу...
Перед ним но после присваивания текста поставь Label2.Refresh;
--------- Обращаться в ICQ: 66550088 (Ally) или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: Студент)
Отправлен: 29.10.2005, 18:27 Оценка за ответ: 5 Комментарий оценки: Label2.Refresh = Application.ProcessMessages Такого еще не предлагали, но результат аналогичен уже предложенному. А по поводу имени - чтобы особо умные эксперты не придирались к моим вопросам выбрал имя соответствующее своему положению :)
Отвечает: Ерёмин Андрей
Здравствуйте, Teapot!
1) Нужно вот так:
2) По умолчанию функция Sleep вызывается из модуля SysUtils.
--------- Бог создал мир за семь дней и до сих пор система работает, не требуя перезагрузки, потому что у него не было необходимости поддерживать совместимость с предыдущими версиями...
Ответ отправил: Ерёмин Андрей (статус: Специалист)
Отправлен: 29.10.2005, 19:16
Отвечает: Маренич Владимир
Здравствуйте, Teapot!
1. Попробуйте перед Sleep добавить строку
Label2.Update;
2. Обычно :) выполняется процедура из модуля, который объявлен позже.
Ответ отправил: Маренич Владимир (статус: 4-ый класс)
Отправлен: 30.10.2005, 16:37
Вопрос № 28.497
Привет. Есть программа Netlook, но сетевые ресурсы она открывает експлорером. Если поставить открывать с помощью программы и эта программа сама должна запускаться с параметрами, то открытия ресурсов не происходит (не может справиться с двумя и более параметрами). Если комуто не влом будет написать програмку которая бы могла тот параметр с которым ее запустили, передать другой программе, которая тоже запускается с параметром был бы вам признателен.
Вот строка запуска программы к которому нада добавить параметр передаваемый программой нетлук:
"C:Program FilesTotal Commander XPTOTALCMD.EXE" /I=".ProfilesProfmain.ini" /F=".ProfilesProfftp.ini"
Заранее благодарен...
Отправлен: 29.10.2005, 15:56
Вопрос задал: Vovochka (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 12)
Отвечает: sir henry
Здравствуйте, Vovochka!
Наше решительное "НЕТ!" лентяям и лоботрясам.
Пишите сами. А если в ходе написания возникнут трудности, тогда пожалуйте сюда, поможем.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.10.2005, 17:18 Оценка за ответ: 1 Комментарий оценки: Если бы я мог программировать, то задал бы вопрос о проблеме. Если ты не хочешь помогать, то не стоило даже высылать ответ...
Отвечает: Delphin
Здравствуйте, Vovochka!
В чем проблема??
В строку добавим все параметры. ( Их число ParamCount. )
Добавляй каждый в одну строку через пробел.
А потом запусти.
Но так как вы я понял не сильны в программировании. То я могу выслать вам программу :-) DelphinSter@Gmail.com - Пишите я пришлю. 41 кб несжатый :-)
Приложение:
--------- Обращаться в ICQ: 66550088 (Ally) или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: Студент)
Отправлен: 29.10.2005, 18:08 Оценка за ответ: 5 Комментарий оценки: Огромное спасибо...