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

Delphi для профессионалов

  Все выпуски  

Delphi для профессионалов - Раздел 'Вопрос-ответ'


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


Профессиональная реклама в интернет. Русскоязычный рекламный брокер.

Рассылка: Delphi для профессионалов

Количество подписчиков: 4252
Рассылка 'Delphi для профессионалов'

Выберите действие:
Заглавие (одной строкой) :
Содержание :

От кого :
Не показывать мой e-mail другим пользователям


Раздел "Вопрос-ответ"

 

Результаты

Вопрос №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)
and (
((year mod 100) <> 0) or (year mod 400) = 0)));
Учет или не учет последнего условия: ((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-ask@igp.org.ua
Все ответы присылайте по адресу: 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/.
Здесь Вы найдете ответы на все Ваши вопросы!

Выберите действие:
Заглавие (одной строкой) :
Содержание :

От кого :
Не показывать мой e-mail другим пользователям



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное