Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Delphi - проблемы и решения" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Delphi для профессионалов - Раздел 'Вопрос-ответ'
Информационный Канал Subscribe.Ru |
Рассылка: Delphi для профессионалов
Количество подписчиков: 4252

Раздел "Вопрос-ответ"
Результаты
Вопрос №26: ReadKey
В "Паскале" есть процедура ReadKey, которая отсутсвует в Delphi.
Процедура позволяла при работе программы управлять курсором с помощью клавиш на
клавиатуре с точностью до одного пикселя. Компонент UpDown в Delphi не удобен,
т.к. занимает место в рабочем окне. Как можно в Delphi-6 использовать клавиши
управления курсором?
Ответ №1 (Nеcromancer the UNNAMED): Используй Таймер с минимальным интервалом. В обработчике пиши:
If getasynckeyvalue(VK_ALT {Здесь - любая кнопка, поищи в помощи коды}) <>0 then caption := 'Alt pressed' else caption := '';
Вопрос №28: Вопрос о трее
Здраствуйте, я хотел бы спросить как в Delphi можно отправляя иконку в трей
и убирая окно, считывать нажатия клавиш в любом другом окне (Word, Excel, блокнот
и др.). Например с отображением этих символов на форме скрытого окна, или как
определять нажатие клавиши + нажатие мыши, или просто миши. Спасибо.
Ответ №1 (Anton): Тебе нужно написать hook, который будет ловить все кликанья и получать handle окна на котором кликнули и где, а по handle можно текст получить.
Ответ №2 (Nuka_Cola): Можно установить system-wide hook и отлавливать нажатия клавы/мыши в любом приложении. Только придется писать dll.
Вопрос №30: Создание файлов
Здравствуйте!!!
У меня возникают проблемы с созданием файлов. Я пользуюсь процедурой AssignFile
и для создания Rewrite, но во время прогона проги, выдается сообщение о том, что
либо файл уже существует, либо файл создан и дальше ничего не происходит. В то
время мне нужно что бы прога записывала данные в этот файл.
Ответ №1 (Anton): попробуй Rewrite(Cals,1);
Ответ №2 (Pavel Manzharov): Ну во первых ошибка скорее всего возникает в строке WriteLN({запись в файл});
Второе. CloseFile(cals); находится в блоке try и если возникает ошибка закрытие файла не происходит, и при повторном запуске (компиляции), ты пытаешься открыть уже открытый файл отсюда еще одна ошибка.
Третье. Есть такая функция FileExists(namefile) проверяет наличие файла на диске, которая в данном случае очень пригодилась бы.
Отсюда получаем что-то подобное:
type TFileData=record Name:String[10]; ExtDat:Extended; end; var Cals: File of TFileData; CalsData: TFileData; procedure NAME; //Описание процедуры var p: Real; u: Byte; begin Road:='{файл}.dat'; Dest:='{каталог}'+Road; try AssignFile(Cals,Dest); // Если файл существует открываем на чтение, иначе создаем новый If FileExists(Cals) then Reset(cals) else Rewrite(cals); // здесь пишем твой код для вывода графика и нужных расчетов //. // установим позицию чтения в конец файла seek (cals,filesize(cals)); CalsData.Name := 'название параметра'; CalsData.ExtDat := {сами данные}; Write(Cals,CalsData); except on E: EInOutError do ShowMessage('При выполнении файловой операции возникла ошибка'+ ' № '+ IntToStr(E. ErrorCode)+': '+SysErrorMessage(GetLastError)); on E: EAccessViolation do ShowMessage('Ошибка!: '+SysErrorMessage(GetLastError)); end; CloseFile(cals); //Независимо от того что произошло выше закрываем открытый файл end;Вот такой вариант должен работать.
Вопрос №31: Как
Програмно Создать Папку На Delphi7 Или 6
Как Програмно Создать Папку На Delphi7 Или 6?
Ответ №1 (Толстопят Евгений): ForceDirectories(Dir);
Ответ №2 (Alexander Diouzshev-Maltsev): MkDir - да, но есть методы на мой взгляд получше...
CreateDir - Creates a new directory.
ForceDirectories - Creates a new directory, also creating parents as needed.
Вопрос №32: Свойства объектов?
Допустим на форме имеется n объектов CheckBox. Каким образом сразу всем этим
объектам сменить свойство Checked (или надо для каждого писать ChecBox.Checked:=true,
а если n=100)?
Предполагаемое решение: Сделать это циклом: for i:=0 to Form1.ComponentCount
do (Form1.Components[i] as TCheckBox).Ckeched:=True;
Ответ №1 (Anton): Так не работает
for i:=0 to Form1.ComponentCount do (Form1.Components[i] as TCheckBox).Ckeched:=True;А вот так работает:
for i:=0 to Form1.ComponentCount-1 do begin if Form1.Components[i].ClassType=TCheckBox then (Form1.Components[i] as TCheckBox).Checked:=True; end;Ответ №2 (Alexander V. Kil): Надо меньше лениться! Если к каждому компоненту обращаться через "as", для 100 штук это будет уже заметно на некоторых машинах. Проблема в том, что при этом выполняется куча кода.
Ответ №3 (Alexander Diouzshev-Maltsev): Дополенение к предложению:
Разбить на группы CheckBox'ы можно выставив разные значения свойства Tag, тогда код:
for i:=0 to Form1.ComponentCount -1 do if Form1.Components[i] is TCheckBox then with (Form1.Components[i] as TCheckBox) do begin case Tag of :1 Checked := True; :2 Checked:= False; else Enabled := False; end;
Вопрос №33: Высокосные
года
Задача. Необходимо определить какие года являются високосными по заданным значениям
n и m (n<m) если n+1 до m
Предполагаемое решение: if (year mod 4)=0 then VysokosnyGod:=True;
Ответ №1 (Nеcromancer the UNNAMED):
if (year mod 4 = 0 ) and not ((year mod 100 = 0) and not ((year mod 400 = 0) and not (year mod 1000 = 0))) then Visokos := true;
Выглядит довольно страшно, но на самом деле именно так и считается.Ответ №2 (Dmitriev V.A.): Функция IsLeapYear(Year: Word): Boolean;
Модуль: SysUtils
Описание: Функция определяет, является ли високосным год, указанный в параметре Year. Если год високосный, то функция возвращает True, а иначе - False.
Пример
var S: string; Year, Month, Day: Word; begin DecodeDate(Date, Year, Month, Day); if IsLeapYear(Year) then S:= 'високосный' else S:='не високосный'; MessageDlg('Текущий год - '+ S, mtInformation, [mbOk], 0); end;P.S. от ведущего: А ведь действительно! Зачем мы тут голову ломаем?! :) Хотя разминка извилинам не помешает!
Ответ №3 (Roman Lykov): Насколько мне известно:
if ( (year mod 4)=0 ) and ( ((year mod 100)<>0) or ((year mod 1000)=0) ) then VysokosnyGod := True else VysokosnyGod := False;Ответ №4 (АлК):
unit SysUtils
function IsLeapYear(Year : Word) : Boolean;Ответ №5 (P@Ssword): вЫсокосные... Не помешало бы обратиться к орфографическому словарю :)
Можно так:
If (Year Mod 400) = 0 then Visok := True else If (Year Mod 100) = 0 then Visok := False else If (Year Mod 4) = 0 then Visok := True else Visok := False; Но можно и так: Visok := (Year Mod 4 = 0) And (Year Mod 100 <> 0) Or (Year Mod 400 = 0)Ответ №6 (Eugene Gerashchenko aka GEV_256): Високосным годом, как известно, называется год, номер которого делится на 4, но не делится на 100, а также год, номер которого делится на 4.
if ((Year mod 4 = 0) and (Year mod 100 <> 0)) or (Year mod 400 = 0) then LeapYear:= True else LeapYear:= False;Ответ №7 (PVG): По григорианскому календарю год считается високосным если его номер делится на 4, кроме тех что делятся на 100 и не делятся на 400. То есть:
VysocosnyGod = ((year mod 4)=0)Учет или не учет последнего условия: ((year mod 100) <> 0) or (year mod 400) = 0)) и есть различие григорианского и юлианского календарей (нового и старого стилей).
and (
((year mod 100) <> 0) or (year mod 400) = 0)));
Вопрос №35: Использование
красивых кнопок Windows XP
Я уверен, что вы знакомы с Windows XP, точнее с ее интерфейсом, а еще точнее
- с ее красивыми сглаженными кнопками. Как можно их использовать в своих программах?
Предполагаемое решение: Если использовать
стандартные компоненты VCL и запускать программу под WinXP, то сама операционка
их такими и рисует.
Ответ №1 (Nеcromancer the UNNAMED): "Предполагаемое" решение неверно :) В Delphi 7 есть компонент XPManifest на вкладке Win32, просто брось его на форму. Но сразу предупреждаю: он иногда глючит.
Вопрос №37: Регулярные
выражения
Доброе утро! Коль уже пошёл разговор про фильтрованный поиск в строке по маске,
то может есть (или Вы знаете где взять) и более продвинутый поиск, а именно поиск
по регулярным выражениям. Я встречал такой поиск на си, а меня бы обрадовал на
паскале.
Ответ №1 (wital(mailru)): сайт http://anso.da.ru/ или http://anso.virtualave.net/
компонент TRegExpr v.0.947
А для ясности с принципами работы есть очень хорошая книга. Называется необычно "Регулярные выражения". Автора, извините не помню. Поищите по книжным магазинам.Ответ №2 (Denis Rybakov): Regular Expressions for Delphi (TRegExpr), автор Andrey V. Sorokin. Взять можно на http://anso.virtualave.net/.
Ответ №3 (Alexandr Belayev): Буквально дня 2 назад нашёл на torry.net несколько компонентов реализующий RegularExpressions.
Ответ №4 (Buyanov): Библиотека, работающая с регулярными выражениями и напасанная на Object Pascal есть на http://anso.da.ru/.
Ответ №5 (Yason): http://delphi.mastak.ru/cgi-bin/links.pl?get=61 :: AnSo Delphi page :: Регулярные выражения (regular expressions) для дельфи с полными и бесплатными исходниками. На сайте есть описание (на русском), примеры (в т.ч. как извлекать информацию из html-страниц).
Вопрос №38: Работа
с RichEdit
Как узнать положение текстового курсора в пикселах? А точнее : какое сообшение
нужно послать
Ответ №1 (АндрейV): Виндовые функции работы с кареткой(попиксельно): GetCaretPos и SetCaretPos.
Ответ №2 (Roman): Найди на диске файл sqledit.pas, и посмотри реализацию в нём метода TSQLEditForm.DrawCaretPosIndicator.
Ответ №3 (Денис Симоненко):
reEditWindow.Perform(EM_CHARFROMPOS, 0, Integer(@WordPoint));
Вопрос №40: TMemo
Привет! Не подскажет ли кто, где найти метод, отвечающий за прорисовку компонента
TMemo, перерыл почти весь VLC, но ничего не нашел. TCustomEdit, ничего такого
не имеет, и все его ниследники тоже! Помогите, если кто что знает.
Ответ №1 (Alexandr Belayev): Компонент TMemo это стандартный виндовый контрол. И изменить его можно только перекрыв WNDProc. Если ты хочешь в нём разукрашивать текст - не связывайся. Лучше RichEdit.
Ответ №2 (fozzgen): у TWinControl есть пара методов для прорисовки всякого.. вообще, за отрисовку TMemo отвечает win, т.к. это его элемент.. но в TWinControl покопаться стоит...
Новые вопросы
Вопрос №27: Вывод
значения в LPT порт
Почему нижеприведенный код не работает в Win XP, а в Win 98/Me все нормально?
И как с этим бороться.
asm
mov dx,$378
mov al,$ff
out dx,al
end;
Предполагаемое решение: Для начала посмотри ответ №1 к вопросу
15. Вообще WinXP/2k/NT - другого класса операционки против Win9x. Я лично с LPT
не работал, но предположу, что как и множество других операций требуется получить
привелегии в данном случае для записи в порт LPT напрямую.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №29: web-камеры
и потоковый звук
Привет. Где можно взять хоть какую-нибудь информацию(мануалы, компоненты, ....)
по работе с web-камерами и потоковым звуком. Предо мной стоит задача сделать что-то
вроде Net Meeting. Спасибо..
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №34: ненужные
дисководы в DriveComboBox
Не могу удалить ненужные дисководы из компоненты DriveComboBox(нужно для программы)
и потом сделать обращение к одному из выбранных?
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №36: Как
правильно работать с LoginDialog?
Как правильно работать с функцией LoginDialog? Спасибо!
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №41: Русификация
Делфи
Я столкнулся с такой проблемой: есть неплохая функция MessageDlg но все кнопки
на английском. Залез я в модули Dialogs и Consts и поменял названия на русские.
Ноль имоций. Все кнопки на английском.
Предполагаемое решение:
То что поменял названия на русские - молодец! За надписи на кнопках отвечают константы
с названием SMsgDlgXXXX. Желательно отредактированные файлы скопировать в папку
проекта. А если все кнопки и в этом случае на английском, то, вероято, в опциях
проекта установлен параметр "Build with runtime packages".
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №42: Запуск
EXE-файла
Возникла у меня такая проблема: каким образом могу я в своей программке запустить
exeшный файл? Очень буду благодарен за помощь.
Предполагаемое решение:
WinAPI :: ShellExecute, можно и WinExec.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №43: Работа
с CMOS BIOS из под WIN2000
Здравствуйте ! В настройках CMOS
BIOS есть опция, позволяющая устанавливать время старта системы. В основном я
использую это, как "продвинутый" будильник. Но каждый раз приходится
ловить момент перезагрузки и переставлять время, что довольно не удобно. Доступ
к CMOS BIOS можно получить через обращение к портам 70h и 71h. Но это возможно
в реальном режиме. Windows ругается на следующий код:
mov dx,70 mov ax,3 out dx,ax inc dx in ax,dx
сообщая о какой то недопустимой
привелигированной инструкции процессора. Говорят, что для доступа к этим портам
нужно иметь уровнь доступа RING0, а уровень прикладной программы RING3. Чесно
говоря не особо понимаю, о чем речь (об RING). Если кто натыкался на подобные
вилы - напишите
Предполагаемое решение: Это уровень привилегированных инструкций для
процессора (RING0 - операционная система, и т.д.). Но к сожалению я не знаю как
их использовать.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №44: Тип
файлов в SaveDialog'е
Моя программа использует плагины для сохранекния файлов. У каждого плагина
свои навороты, но расширения могут совпадать. Каждый плагин добавляет свой тип
файла в список диалога. Вопрос: как узнать, какой плагин выбран?
Предполагаемое решение: В TSaveDialog есть свойство FilterIndex - указывает
номер выбранного типа файлов.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №45: Работа
с Excel
Довольно длительное время пытаюсь найти толковый компонент для работы с Excel.
Задача проста - необходимо читать данные из книги. Единственная проблеммка - у
меня нет инета. E-mail only. Очень здорово помогают рассылки подобные Вашей. Не
могли бы Вы посоветовать что-нибудь для меня? Если есть что-то под рукой - буду
рад поймать в мыльнице. Но даже ссылочка на такой компонент здорово бы помогола.
Предполагаемое решение: А зачем голову ломать? Начиная с Delphi6 есть
встроенные компоненты для работы с MS Office.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №46: Копирование
Как в Дельфи осуществить копирование файла без вызова WinApi? Проблема вот
в чем, необходимо скопировать файл и переименовать его так, чтобы перед именем
файла записалась системная дата на момент копирования? (т.е. например: было copy.zip,
стало 12_08_2002_copy.zip)?
Предполагаемое решение: Посмотри для начала пример по процедуре BlockRead
в помощи по Delphi.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №47: База MySQL
как подключить в Делфях базы MySQL?
Предполагаемое решение: Установить mySQL драйвер под Windows. Работать
через ADO.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №48: Как добавить
русский драйвер?
Как добавить русский драйвер для таблиц
Dbase и Paradox через функции BDE API (unit BDE), хочу использовать при инсталяции
ПО (автоматического добавления алиаса и установки русского драйвера.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №49: Инсталляционый
пакет
Работаю с Базами данных - создал проект
в Delphi и неожиданно сталкнулся с проблемой. Создал инсталляционый пакет пытаюсь
установить программу на другом ПК (на нем только Windows) и ничего не получается
двое суток итак - исяк гоняю программу, что делать не знаю. Где я ошибся что не
учел??? InstallShieldExpress 3.03, Delphi 6, БД - Paradox.
Предполагаемое решение: При создании инсталляционного пакета нужно
указать о необходимости установки BDE и алиаса.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №50: Case
Ни кто не подскажет, есть ли какая-нибудь
Case система для Object Pascal, с бучевской нотацией
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №51: Двумерная матрица
мне надо создать двумерную матрицу, но
того размера который я укажу в процессе работы программы. пытался объявлять как
array of array of real, а потом задавать размерность SetLenght, но чего-то всегда
возникало исключение EAccessViolation.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №52: Мне надо файло!
(Nuzur)
У меня есть доки по Delphi и там в одном
уроке нада файло хелпы с именем ddedemo, буду очень признателен за файл или за
"разчихление" в dde. заранее благодарен.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №53: TreeView
Можно получить ссылку на TreeNode используя
TTreeNode.Data?
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №54: Пауза в Windows
Как сделать паузу в процедуре, чтобы программа продолжала реагировать на сообщения
операционной системы. Пробовал Sleep(), но если пауза большая, то эффект зависшей
программы.
Предполагаемое решение: Попробуй процедуру Delay.
procedure Delay(MSecs: Longint); var FirstTickCount, Now: Longint; begin FirstTickCount := GetTickCount; repeat Application.ProcessMessages; { allowing access to other controls, etc. } Now := GetTickCount; until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount); end;
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №55: Работа с реестром
Есть ли какие-либо API функции или другие
примочки для работы с Реестром (Добавление записей, чтение, и пр.)
Предполагаемое решение: Модуль Registry.pas, классы TRegistry, TRegIniFile.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №56: Определение активных подключений
к IB-серверу
Каким образом можно определить имена всех
пользователей (Username) подключенных в данный момент к серверу InterBase?
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №57: Работа с реестром
Есть ли какие-либо API функции или другие
примочки для работы с Реестром (Добавление записей, чтение, и пр.)
Предполагаемое решение: Модуль Registry.pas, классы TRegistry, TRegIniFile.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №58: Как проверить
изменена ли база данных (Paradox Table) после открытия?
Как проверить изменена ли база данных (Paradox
Table) после открытия ? Событие OnUpdateData не вызывается при программном добавлении/удалении
записи. Table.Modify также делает проверку только текущей записи.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №59: TBX дляTB2k
2.0.13 и TBSkin+
Мечтаю поставить оба вышеуказанных компонента
одновременно. Есть какой-нибудь рецепт? Или может быть у одного из них неоспроримые
преимущества перед другим? Помогите, plz.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №60: Многострочный
header в DBGrib
Может кто поделится идеями, как реализовать
возможность показывать header к столбцам дынных в DBGrid в несколько строк? Хотелось
бы, чтобы перенос слов (названий столбцов данных) происходил автоматически в зависимости
от ширины столбца. Я думаю, что нужно переписывать сам DBGrid, но как там все
это замутить с ходу не разоборался... :( Тем более, что там все это находится
в private секции. Писать новый компонент не хотелось бы, т.к. желательно сохранить
совместимость с DBGrid со стороны других компонентов.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Все ответы присылайте по адресу: delphi-reply@igp.org.ua
Все подсказки присылайте по адресу: delphi-hint@igp.org.ua
Со всем списком советов можно познакомиться по адресу: http://igp.org.ua/delphine/.
Наш проект Delphine можно найти по следующей ссылке: http://igp.org.ua/products/delphine/.
Заходите в наш форум: Форум Delphi-профессионалов. Адрес: http://forum.igp.org.ua/.
Здесь Вы найдете ответы на все Ваши вопросы!
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||