Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi

Автор: EvSeKo
Дата сообщения: 06.08.2005 05:09
Здравствуйте, у меня вопрос.
Я пишу консольную прогу, которая решает СЛАУ итерационным методом. Системы бывают очень большими и порядок точности тоже немаленький, поэтому процесс может затянуться на долгое время. А теперь вопрос, как во время цикла узнать что была нажата клавиша, чтобы приостановить процесс? Я знаю, что в паскале есть функции keypressed и readkey, а в делфи их не оказалось. Народ, кто знает как решить эту проблему? Заранее благодарен.

Добавлено:
Проблема решена. Как я сразу не догадался? Нужно было просто скопировать эти функции из паскаля(CRT) и немного подправить.
Автор: moonrise
Дата сообщения: 06.08.2005 09:13
EvSeKo

Цитата:
А теперь вопрос, как во время цикла узнать что была нажата клавиша, чтобы приостановить процесс? Я знаю, что в паскале есть функции keypressed и readkey, а в делфи их не оказалось. Народ, кто знает как решить эту проблему? Заранее благодарен.

а) в конце цикла ставишь вызов процедуры ProcessMessages;
б) procedure KeyPress(var Key: Char); dynamic;
или событие (на примере формы) procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
Автор: 2Polkan
Дата сообщения: 06.08.2005 10:15
Люди, помогите ньюбу :). Чем отличается Форма от Фрейма? Если мне нужно окно для ввода данных через Edit, лучше сделать это на форме или фрейме?
Автор: moonrise
Дата сообщения: 06.08.2005 11:26
еще вопрос:
обновил инди с 9 на indy10.0.76_d7.exe

а) пропал метод onSystem
б) думал что вместо него - ServerStatsReceived. но при добавлении выдается ошибка на ОПИСАНИЕ процедуры:
[Error] Unit1.pas(13): Undeclared identifier: 'TIdContext'
в) метод onNiotice визуально есть, но при даблклике выдается окошко, что метод не поддерживается

Добавлено:
2Polkan

Цитата:
Люди, помогите ньюбу . Чем отличается Форма от Фрейма? Если мне нужно окно для ввода данных через Edit, лучше сделать это на форме или фрейме?

фрейм для мультиоконных приложений (кажется)
Автор: Xarde
Дата сообщения: 06.08.2005 16:55
2Polkan
Форма - это окно приложения. На ней могут располагаться любые компоненты, включая и фреймы.
Фрейм тоже может содержать различные компоненты и внешне похож на форму. Но нужен для того, чтобы оптимизировать процесс разработки. Если у тебя есть на многих формах, скажем по лабеле с эдитой, причем расположены они всегда в одном месте и обрабатываются везде одинаково, то здесь самое место для фрейма. Ложишь лабелу с эдитой на фрейм, а на формы ложишь уже сам фрейм. Что это дает? Обработку событий лабелы с эдитой ты пишешь всего один раз - для фрейма.
Что же касается твоего случая, то ответ прост - если всегда будетя вызываться одно окно, то делай форму, если же кроме этого окна есть куда еще положить такую эдиту - делай фрейм.
Автор: Andy_Solo
Дата сообщения: 11.08.2005 15:34
Как добиться отладки приложений ASP.NET в Delphi 2005. При запуске появляется ошибка:
"Unable to start debugging on the web server. Unable to attach to ASP.NET worker process (typically aspnet_wp.exe or w3wp.exe)"
Автор: Zakalve
Дата сообщения: 11.08.2005 18:05
Прошу прощения за возможно наивный вопрос.

Требуется вводить некий текст с маской в компоненте Edit либо MaskEdit.

MaskEdit не устраивает по нескольким причинам:
1. Фиксированое количество символов.
2. Требует вводить символ для пустых мест (Blank), что довольно некрасиво выглядит.

Пробовал писать некие проверки для компонента Edit, но не совсем понятно на какой event их вешать, потому что OnKeyDown, OnKeyPress и OnKeyUp не блокируют неправильный символ, а стирают после написания.

Заранее спасибо.
Автор: ShIvADeSt
Дата сообщения: 12.08.2005 01:18
Zakalve

Цитата:
Требуется вводить некий текст с маской в компоненте Edit либо MaskEdit.


Цитата:
MaskEdit не устраивает по нескольким причинам:
1. Фиксированое количество символов.

сам себе противоречишь, либо вводить по маске, тогда маскедит наш выбор, либо уточни что ты имеешь под маской. В крайнем случае маску можно и на лету менять, вернее после каждого ввода текста.

Цитата:
Пробовал писать некие проверки для компонента Edit, но не совсем понятно на какой event их вешать, потому что OnKeyDown, OnKeyPress и OnKeyUp не блокируют неправильный символ, а стирают после написания.

Ты уверен, что правильно все обрабатывал?
вот моя обработка OnKeyPress и каждый раз когда юзер нажимает a в едите появляется b

Цитата:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key='a' then Key:='b';
end;

Автор: Felan
Дата сообщения: 12.08.2005 09:20
Zakalve
Вариант крайне сырой, но можно так:

procedure TfrmProgCFG.lbeBaseMCAddrKeyPress(Sender: TObject;
var Key: Char);
var
Num: Integer;
begin
Num := 0;
if not (Key in ['0'..'9', #8]) then
Key := #0;
if not (TryStrToInt(lbeBaseMCAddr.Text + Key, Num)
and (Num > 0) and (Num <= 120)) and (Key <> #8) then
Key := #0;
end;
Автор: Zakalve
Дата сообщения: 14.08.2005 10:05
2ShIvADeSt
Возможно действительно не совем коректно описал.
В компонент типа Edit (MaskEdit) необходимо вводить последовательности любой длины содержащие к примеру только цифры и 4 неких буквы, допутим X Y Z W.
MaskEdit вроде бы при установке маски требует точное количество, из скольки символов будет писаться строка.
А Edit на ивенте OnKeyPress вроде бы стирает символы неправильные а не не дает им
писаться вообще. То есть если я нажму допустим не цифру и не XYZW, то он напишет ее в строке а потом отработав условие типа
if not (Key in ['0'..'9', #8]) then
сотрет ее. А требуется чтобы он вообще не давал писать символы, не предусмотренные правилами.
Автор: Xarde
Дата сообщения: 14.08.2005 22:12
Zakalve
Обработка происходит _до_ изменения отображения эдиты, поэтому можешь смело затирать неприемлемые символы.
Автор: ShIvADeSt
Дата сообщения: 15.08.2005 00:46
Zakalve

Цитата:
А Edit на ивенте OnKeyPress вроде бы стирает символы неправильные а не не дает им
писаться вообще.

Все ясно, ты даже не тестил код, а просто пишешь, что он ВРОДЕ БЫ не рабочий.

Цитата:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key='a' then Key:='b';
end;

При работе данного кода, ты даже не увидишь, что пишется буква а, а сразу будет выводиться б. Неужели так трудно было вставить это в дельфи и проверить? Тогда бы
Цитата:
То есть если я нажму допустим не цифру и не XYZW, то он напишет ее в строке а потом отработав условие типа
if not (Key in ['0'..'9', #8]) then
сотрет ее. А требуется чтобы он вообще не давал писать символы, не предусмотренные правилами.

ты не написал бы.
Автор: zvyagaaa
Дата сообщения: 15.08.2005 05:36
Господа, вопрос у меня возник не праздный. Мне необходимо создать массив из FieldNames в ADO Tables? Причем, я как понимаю, имена полей в формате WideString, а нужно Float.
Либо, как можно еще решить следующую задачу. Мне необходимо проинтерполировать два столбца с определенным коэффициентом. Допустим, в одном столбце (табличное значение) значение физической величины 0,5 в следующем 1, а реально оно получилось 0,75. Так вот, как мне найти число, которое находится в строчку?
Попробую по-понятней. Есть следующего вида таблица. Мне известны данные, например, столбца, 0,75, строки 1,как найти то, что значение этой величины будет 1,5?
ADOTable использовать обязательно. Раньше, я пользовался массивом, но это не есть гуд.
|0,5 |1
1 |1 | 2
2 |3 |4
Надеюсь на помощь.
Автор: Felan
Дата сообщения: 15.08.2005 09:45
Zakalve
Читай внимательно мой пример. Если присвоить Key := #0, то будет считаться, что вообще кнопка не нажата.
Неверишь, исходники TWinControl посмотри.

ЗЫЖ Раз уж просишь помоши, так хоть разобрался бы с тем, что тебе советуют.
Автор: EvSeKo
Дата сообщения: 15.08.2005 18:20
Уважаемы участники форума, позвольте поинтересоваться.
Я слыхал, что существует какой-то формат для хранения чисел в файле, этот формат формат имеет такое свойство, что любое число будет занимать 10 байт(если я не ошибаюсь). Подскажите, пожалуйста, так ли это. Заранее благодарен.
Автор: EAS
Дата сообщения: 15.08.2005 21:44
10 байт занимают данные типа extended (для x86). Числа не совсем любые , а в диапазоне 3.6 x 10^-4951 .. 1.1 x 10^4932. С плавающей точкой (действительные числа), точность 19-20 разрядов.
А хранить их в файле или в памяти - значения не имеет
Автор: zvyagaaa
Дата сообщения: 16.08.2005 05:33
Ну так что, никто решение не подскажет?
Автор: EvSeKo
Дата сообщения: 16.08.2005 05:41
А вот насчёт хранения в файле позвольте не согласиться.
Допустим у меня есть число 7,62939453125E-7 и если я его сохраню в файл, предварительно преобразовав его функцией floattostr, то займет оно 16 байт, а не 10. Поэтому я и задал этот вопрос, может есть какой то другой способ.
Автор: evle
Дата сообщения: 16.08.2005 06:06
EvSeKo
А не надо его преобразовывать. Пиши не в текстовый файл.
zvyagaaa
А зачем тебе для таких задач база данных? По-моему массив лучше.
Ну, раз уж так, есть пара вопросов.

Шаг между табличными значениями постоянный?
Какая используется интерполяция?

Автор: SergeBS
Дата сообщения: 16.08.2005 16:14
zvyagaaa

Цитата:

Ну так что, никто решение не подскажет?

А ты понятней объяснить можешь, что тебе надо?
По одной строке данных проинтерполировать значения другой строки или что?
Ни черта ведь не понятно из твоего описания. Где входные данные, где результат?
А в твой винегрет еще и способ доступа к данным примешан.

Вот это

Цитата:
Господа, вопрос у меня возник не праздный. Мне необходимо создать массив из FieldNames в ADO Tables? Причем, я как понимаю, имена полей в формате WideString, а нужно Float.

вообще песня. Имя поля в формате float - это как? Сам-то понял, что сказал?
Автор: Sky_Drake
Дата сообщения: 17.08.2005 08:28
Здравствуйте!
Помогите мне, пожалуйста, с такой штукой.
В Delphi мне нужно помимо основной формы создать ещё один поток, только без окна и самому написать оконную процедуру WndProc где я самостоятельно буду обрабатывать всякие сообщения (WM_ и не только)
Мне это нужно для того, чтобы новый созданый поток сам следил за некоторыми событиями, ловил сообщения от устройств ввода, и т.п. и соответственно изменял некоторые нужные переменные. А программа для основной формы может использовать эти переменные как захочет.
Желательно в этом вспомогательном потоке не использовать никаких средств Delphi - было бы удобно писать код этого вспомогательного потока как WinMain в VisualC++. Я имею ввиду создать, зарегистрировать свой оконный класс, создать невидимое окно, создать message loop и свою процедуру WndProc.
В справке я не смог найти ничего понятного мне. Извините если эта тема уже обсуждалась где-то, тогда пожалуйста киньте мне ссылку.
Автор: ShIvADeSt
Дата сообщения: 17.08.2005 09:00
Sky_Drake

Цитата:
В Delphi мне нужно помимо основной формы создать ещё один поток, только без окна и самому написать оконную процедуру WndProc где я самостоятельно буду обрабатывать всякие сообщения (WM_ и не только)

сам себе противоречишь, если нет окна то оконные сообщения никому не пойдут.

Цитата:
Мне это нужно для того, чтобы новый созданый поток сам следил за некоторыми событиями, ловил сообщения от устройств ввода, и т.п. и соответственно изменял некоторые нужные переменные. А программа для основной формы может использовать эти переменные как захочет.
Желательно в этом вспомогательном потоке не использовать никаких средств Delphi - было бы удобно писать код этого вспомогательного потока как WinMain в VisualC++. Я имею ввиду создать, зарегистрировать свой оконный класс, создать невидимое окно, создать message loop и свою процедуру WndProc.

все что ты перечислил (кроме подмены на свои переменные) реализуется через хуки. Как понять основная программа будет использовать эти переменнные? В смысле логировать их или что?
Поставь задачу понятнее без противоречий, и тогда можно будет конкретно дать ответ. А так задача либо не реашется. либо решается через хуки на клаву и мышь (если ты их имел под устройствами ввода)
Автор: reflexfx
Дата сообщения: 17.08.2005 09:38
Приветов всем, нужна помощь.
Использую Indy и компонент TIdSMTP для отправки писем, все работает нармально при условии что в имени компа не присутсвуют русские буквы, если еть то выдает Invalid domain name - как обойти это, если кто сталкивался помогите...
Автор: Sky_Drake
Дата сообщения: 17.08.2005 10:14
Ок, может я непонятно объяснил. Вообще - я начинающий, поэтому многих вещей не знаю.
Вобщем - Delphi - хорошая штука. Можно очень быстро разрабатывать программы - шлёпнул компонент по форме, описал его реакции на внешние воздействия и готово.
Создание собственной оконной процедуры WndProc тоже удобно (согласен - я не прав - без окна сообщения не пойдут, я имел ввиду окно должно быть невидимым).
Хотелось бы объединить эти две вещи - первая что не нужно мучаться с каждым элементом формы (как это в VisualC++), а просто единым кликом мыши создать нужный компонент и позаботиться о его реакциях, вторая - внутри собственной оконной процедуры вытворять всё что угодно.
Собственная WndProc должна изменять значения каких-либо глобальных переменных. Основная форма (которую создала Delphi) просто использует значения этих переменных для своих нужд, например label1.caption:=somtext; переменная sometext изменяется в WndProc.
Я знаю что есть такой тип методов как message - перекрывает реакцию на событие WndProc у класса. То есть можно создать процедуру-обработчик на событие, например, основной формы. Но мне не очень нравится этот способ. Мне хотелось бы чтобы было так: основная форма - отдельно, моя процедура WndProc - отдельно. Сообщаются они через какие-то переменные.
Насчёт хуков - спасибо, почитаю что это.
Понимаю что это плохой тон задавания вопросов - писать собственный предполагаемый вариант решения. Но я надеюсь что меня кто-нибудь поймёт и подскажет.
Автор: junik
Дата сообщения: 17.08.2005 10:55
Добрый день всем !!

Сейчас работаю с выводом и редактированием РТФ из делфи. В РТФ есть текст и матем. формулы в Equation. Можно ли как-то добиться вертикального выравнивания по центру текста и формул так, как это сделано в ворде?

Может кто-нибудь с таким работал или сталкивался. Ответьте, плиз.
Пользовался rxRichEdit компонентом, но там в исходниках используется интерфейс из библиотек виндовс и по хелпам он не поддерживает вертикальное выравнивание объектов.
Автор: zvyagaaa
Дата сообщения: 17.08.2005 16:25
Уже разобрался сам.
Автор: 2Polkan
Дата сообщения: 18.08.2005 00:30
Помогайте начинающиму :).

Надо проверить, что введено в Edit... Это должно быть целое число от нуля и выше... Как узнать, что это не строка типа "dfsdfsdf"? Блин, книгу посеял где-то, теперь мучаюсь..

Добавлено:
Нет, уже нашел :)). F1 рулит :)
Автор: ShIvADeSt
Дата сообщения: 18.08.2005 01:10
Sky_Drake

Цитата:
Создание собственной оконной процедуры WndProc тоже удобно (согласен - я не прав - без окна сообщения не пойдут, я имел ввиду окно должно быть невидимым).
Хотелось бы объединить эти две вещи - первая что не нужно мучаться с каждым элементом формы (как это в VisualC++), а просто единым кликом мыши создать нужный компонент и позаботиться о его реакциях, вторая - внутри собственной оконной процедуры вытворять всё что угодно.
Собственная WndProc должна изменять значения каких-либо глобальных переменных. Основная форма (которую создала Delphi) просто использует значения этих переменных для своих нужд, например label1.caption:=somtext; переменная sometext изменяется в WndProc.
Я знаю что есть такой тип методов как message - перекрывает реакцию на событие WndProc у класса. То есть можно создать процедуру-обработчик на событие, например, основной формы. Но мне не очень нравится этот способ. Мне хотелось бы чтобы было так: основная форма - отдельно, моя процедура WndProc - отдельно. Сообщаются они через какие-то переменные.

Опять не слишком понятно, что ты хочешь, но вот как можно полностью переопределить WndProc у окна (для чего тебе понадобился другой поток я так и не понял, как и то, что будет происходить внутри WndProc - ведь это просто обработчик оконных процедур, или ты вместо обработчика отдельных событий хочешь иметь возможность обрабатывать в одной процедуре WndProc сразу не сколько событий?) в любом случае вот пример

Цитата:

public
{ Public declarations }
procedure WndProc(var Msg: TMessage);override;
end;
.....

procedure TfrmDialer.WndProc(var Msg: TMessage);
begin
CASE Msg.Msg OF
WM_SYSCOMMAND: if Msg.WParam=AboutProg then ShowAbout;
WM_USER + 1:
case Msg.lParam of
WM_LBUTTONDOWN:
begin
end;
end;
WM_RBUTTONDOWN:
end;
inherited;
end;

Есть возможность также подменить обработчик каждого контрола, который имеет хэндл на свою процедуру обработки. Делается через SetWindowLong и далее по хелпу. Возможно я сумел помочь, так как либо ты что то не правильно называешь, либо просто объясни что конкретно долджно происходить, если это не тайна.
Автор: Sky_Drake
Дата сообщения: 18.08.2005 11:02
Спасибо, это очень похоже на то что мне нужно. Попробую реализовать по твоей подсказке.
Единственное что мне не очень нравится - вызов родительской функции inherited в конце WndProc. Но я думаю если это окошко TfrmDialer (в примере) хорошенько спрятать, например: ShowWindow(TfrmDialer.Handle,SW_HIDE); - то можно почти не вызывать родительскую WndProc.
Моя цель вовсе не секрет. Просто мне удобней так работать. Вот, например, в текущей программе должны ловиться события MM_JOY1MOVE (и тому подобные - связанные с джойстиком). Я должен составить свою процедуру WndProc которая пишет в поля записи (record) положения осей и состояния кнопок. А основное окно mainform просто в определённые промежутки времени читает из записи эти числа и выводит из на окно.
Кстати, подсоединил вместо джойстика переменные резисторы и написал программку, которая изменяет громкость звука в соответствии с положением резистора - получился вполне удачный регулятор громкости. У меня пассивные колонки и регулировать звук раньше приходилось через микшеры на taskbar'е.

У меня ещё вопросы появились
1) WndProc же должна возвращать какое-то значение системе. Каким образом это реализуется? Может как-то неявно?
Ещё мелкие вопросы: 2)можно ли как-то уменьшить размер конечного exe-файла?
И ещё вопрос не по совсем по Delphi: 3)при использовании ассемблерных комманд чтения/записи в порт - in/out выскакивает ошибка Priveleged instruction (как в Delphi так и в VC++) можно ли как-то получить привелегии на использование этих комманд, или Windows по-любому строго-настрого запретит их использовать? Кроме эмуляции ms-dos у меня WindowsXP
Автор: ALeXkRU
Дата сообщения: 18.08.2005 11:14
Sky_Drake

Цитата:
Единственное что мне не очень нравится - вызов родительской функции inherited в конце WndProc

вообще-то если не вызывать - придется вручную писать стОлько кода, оно тебе надо? а так - все наследуется...

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Вероятность одинакового CRC32


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.