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

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 813
от 18.05.2007, 12:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 473, Экспертов: 89
В номере:Вопросов: 6, Ответов: 19


Вопрос № 86575: Уважаемые эксперты! Опять необходима Ваша помощь. К сожалению, я не получил желаемого ответа на мой вопрос №86247 (http://rusfaq.ru/?Step=info&Action=Question&ID=86247), однако ответом на этот вопрос, мне кажется, должен быть следующий SQL-запрос:<br...
Вопрос № 86580: Здраствуйте эксперты Вот говорят, что лучше установить оригинал среды разработки Delphi, чем русифицированную версию, т.к. возможны последствия. Правда ли это? ..
Вопрос № 86584: Здравствуйте я студент 1ого курса, и у меня не большие проблемы с программированием. Не могли вы подсказать, что такое подпрограммы, и чем они отличаются от обычной программы?...
Вопрос № 86590: Здравствуйте, уважаемые эксперты! Подскажите, пожалуйста, каким образом лучше всего устроить проверку введеных данных в Edit (TEdit). Например: имеем Edit1, в который осуществляется ввод номера месяца (1..12, integer). Таких Edit'ов много...
Вопрос № 86620: Здравствуйте уважаемые эксперты. 1) Как сделать, чтобы программа находила окно и посылала туда текст. 2) Как можно перенести тект из моей программы в другую с помощью перетаскивания....
Вопрос № 86628: Здравствуйте! Есть текстовый файл, со строками примерно такого формата: #ключ R G B A "M" ///comment Где R,G,B,A - числовые значеня, M - текст. Задача: необходимо прочитать файл, выбрать ключи (начинаются символом #, заканчи...

Вопрос № 86.575
Уважаемые эксперты! Опять необходима Ваша помощь. К сожалению, я не получил желаемого ответа на мой вопрос №86247 (http://rusfaq.ru/?Step=info&Action=Question&ID=86247), однако ответом на этот вопрос, мне кажется, должен быть следующий SQL-запрос:

SELECT domogospodarstvo, name, name2, name3, birthday, settlement, street, араrtment, house
FROM PersonalTable outer
WHERE dateofrecord = (SELECT MAX(dateofrecord)
FROM PersonalTable inner
WHERE id_number = outer.id_number)
ORDER BY domogospodarstvo ASC

Здесь outer и inner являются заменителями соответственно PersonalTable (для внешнего запроса) и PersonalTable (для внутреннего запроса).
Но и здесь возникает ошибка. Делфи сообщает, что ошибка в строке FROM (в первом). Помогите мне разобраться с этим, поскольку это основная проблема в моей программе, которую я не знаю, как решить.
Отправлен: 12.05.2007, 13:04
Вопрос задал: Bohdan (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 10)

Отвечает: Ерёмин Андрей
Здравствуйте, Bohdan!
Конечно ошибка, потому что синтаксис этих команд совсем другой:
SELECT ... FROM table1 INNER JOIN table2 ON {условия объединения таблиц table1 и table2}
С OUTER точно также, только вместо слова INNER - OUTER.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Помощь, советы, обмен опытом.
ICQ: 286837644
----
Ответ отправлен: 12.05.2007, 13:47

Отвечает: Синельников Сергей
Здравствуйте, Bohdan!

SELECT Id_Number, domogospodarstvo, name, name2, name3, birthday, settlement, street, араrtment, house, dateofrecord
FROM PersonalTable A INNER JOIN (SELECT id_number, MAX(dateofrecord) as MaxDate
FROM PersonalTable GROUP BY Id_Number) B ON (A.Id_number=B.Id_Number AND A.DateOfRecord=B.MaxDate)
ORDER BY domogospodarstvo ASC

Вот так.
Ответ отправил: Синельников Сергей (статус: 4-ый класс)
Ответ отправлен: 13.05.2007, 08:51


Вопрос № 86.580
Здраствуйте эксперты
Вот говорят, что лучше установить оригинал среды разработки Delphi, чем русифицированную версию, т.к. возможны последствия.
Правда ли это?
Отправлен: 12.05.2007, 13:19
Вопрос задал: Исаак Моисеевич (статус: 3-ий класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 9)

Отвечает: Ерёмин Андрей
Здравствуйте, Исаак Моисеевич!
Это частично правда. Изменённые файлы, как правило, имеют другой объём и другую контрольную сумму, а это значит, что многие патчи могут просто перестать работать. Кроме того, насколько мне известно, ни одного официального русификатора Delphi нет, т.е. всё это лишь работа неизвестных людей. Кто знает, какие изменения они внесли в модули - несложно туда и adware/spyware внедрить. Да и вообще, я сколько видел переводов - все какие-то искусственные. Не создётся от этого ощущение, что ты работаешь в русской среде разработки - только наоборот, увеличивается время на поиск нужных элементов интерфейса или пунктов меню. Также существует мнение, что русифицированные версии Delphi очень часто вылетают. Утверждать не буду, но однажды, когда я установил русификатор, работать действительно стало проблематично, т.к. появились непонятные ошибки и "вылеты". Не было это похоже на случайности. Поэтому мой вам совет - используйте оригинальную английскую версию и никаких проблем не буде т.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Помощь, советы, обмен опытом.
ICQ: 286837644
----
Ответ отправлен: 12.05.2007, 14:02
Оценка за ответ: 5

Отвечает: Elpher2006
Здравствуйте, Исаак Моисеевич! Я как-то устанавливал D7 с какой-то русификацией, и проблем вроде никаких не было. Правда на английском все-таки привычнее.

---------
Не делай другим того, чего сам не хочешь испытать!
Ответ отправил: Elpher2006 (статус: 1-ый класс)
Ответ отправлен: 13.05.2007, 03:40
Оценка за ответ: 4


Вопрос № 86.584
Здравствуйте я студент 1ого курса, и у меня не большие проблемы с программированием. Не могли вы подсказать, что такое подпрограммы, и чем они отличаются от обычной программы?
Отправлен: 12.05.2007, 13:51
Вопрос задал: Hellboy (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, Hellboy!
Здесь ключом является приставка "под".
Если программа выполняет Вашу задачу целиком, то подпрограмма выполняет какую-то часть ее Это основное назначение подпрограмм.
Ценность подпрограммы увеличивается во много раз, если та часть задачи, которую она выполняет, встречается в задаче несколько раз. Например надо выполнить какое-нибудь вычисление десять раз. Можно написать код вычисления десять раз, а можно всего один раз, но оформить этот код в виде подпрограммы с каким-то именем. Тогда в теле главной программы Вы просто пишете имя подпрограммы десять раз в нужных местах и все. Согласитесь это сильно экономит время при написании программы и объем исходного кода. :)
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 12.05.2007, 14:01

Отвечает: Уваров Андрей Александрович
Здравствуйте, Hellboy!
Программа это запускаемый файл. (То что получается после компилирования программы. EXE)
А подпрограмма это подфункция функции. Она скрыта от других функций и может быть вызвана только внутри текущей.
Т.е. это разные вещи.
Пример в коде.

Приложение:

---------
Обращаться в ICQ: 66550088 (Ally) или E-Mail: AvePassion@GMail.Com

Ответ отправил: Уваров Андрей Александрович (статус: Студент)
Ответ отправлен: 12.05.2007, 14:04

Отвечает: Ерёмин Андрей
Здравствуйте, Hellboy!
Добавлю, что подпрограммы делятся на процедуры и функции. Их синтаксис отличается всего одним ключевым словом (procedure или function соответственно). Функции возвращают какого-либо значения в результате выполнения, а процедуры используются для серии операций без возвращения значения. Однако процедуры имеют важное преимущество перед функциями - помимо того, что они могут не возвращать никакого значения, они могут возвращать и несколько значений одновременно, в то время как функция возвращает только одно значение.
Подпрограммы используются практически везде. Без их существования написание программ превратилось бы бог знает во что.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Помощь, советы, обмен опытом.
ICQ: 286837644
----
Ответ отправлен: 12.05.2007, 14:07

Отвечает: Elpher2006
Здравствуйте, Hellboy! Подпрограмма - это кусок кода, который выполняет логически завершенную операцию. Также подпрограммы (т.е. процедуры и функции) могут быть обработчиками событий (т.е. чтобы программа что-нибудь сделала принажатии на кнопку, нужна подпрограмма (в данном случае процедура) обработки этого события). Подпрограммы можно использовать для упрощения читабельности кода.

---------
Не делай другим того, чего сам не хочешь испытать!
Ответ отправил: Elpher2006 (статус: 1-ый класс)
Ответ отправлен: 13.05.2007, 03:40


Вопрос № 86.590
Здравствуйте, уважаемые эксперты!
Подскажите, пожалуйста, каким образом лучше всего устроить проверку введеных данных в Edit (TEdit).
Например: имеем Edit1, в который осуществляется ввод номера месяца (1..12, integer).
Таких Edit'ов много, а собственоручно изобретенный велосипед слишком громоздок.
Отправлен: 12.05.2007, 14:51
Вопрос задал: Null (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: UnRe@l
Здравствуйте, Null!
Можно заменить на MaskEdit. Или по событию OnChange:

procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text='13' then
begin
ShowMessage('Error!');
end;
end;
---------
Cogito, ergo sum (c) R. Descartes (1596-1650)
Ответ отправил: UnRe@l (статус: 3-ий класс)
Ответ отправлен: 12.05.2007, 15:07
Оценка за ответ: 3
Комментарий оценки:
Слишком неуниверсально.

Отвечает: Устинов С.Е.
Здравствуйте, Null!

Можете создать функцию

function good(st:string):boolean;
var t:integer;
begin
if (TryStrToInt(st,t)) and (t in [1..12]) then good:=true else good:=false;
end;

Функция вернет результат TRUE если ввели число от 1 до 12, и FALSE в другом случае.
Использовать ее можно так:

if good(Edit1.text) then showmessage('Введено правильно') else Showmessage('Не правильно');

Удачи!
---------
Ждешь квалифицированного ответа? Задай правильно вопрос!
Ответ отправил: Устинов С.Е. (статус: Практикант)
Ответ отправлен: 12.05.2007, 15:08
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо, именно то что я искал.

Отвечает: Denisss

Здравствуйте, Null!

Сначала делаете для Edit1 проверку введенных данных. Для этого создаете обработчик события OnChange и в него пишете что-либо вроде:

var i: Integer;
begin
i:= StrToIntDef(TEdit(Sender).Text, 0);
if (i > 12) or (i < 1) then
ShowMessage('Значение месяца введено неверно');
end;

После этого, всем остальным Edit'ам, отвечающим за ввод месяца назначаете этот OnChange через инспектор свойств (не дважды кликаете, а жмете по кнопке с треугольничком вниз и выбираете из списка).

Удачи!
Ответ отправил: Denisss (статус: Профессионал)
Россия, Москва
WWW: Хлама много, по сути ничего...
ICQ: 281599577
----
Ответ отправлен: 12.05.2007, 15:14
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо, именно то что я искал.

Отвечает: sir henry
Здравствуйте, Null!
Проще всего такую проверку записать в событие OnExit, которое происходит когда Вы покидаете поле ввода сделав там все свои дела, которые хотели:

procedure TForm1.Edit1Exit(Sender: TObject);
Var
m: integer;
begin
m:=StrToInt(Trim(Edit1.Text)); //В поле Edit содержится всегда текстовое значение
//Проверяем, похожа ли цифора на номер месяца
If (m<1) or (m>12) Then
Begin
ShowMessage('А не много ли Вы выпили?'); //Выодим предупреждение
Edit1.SetFocus; //И возвращаемся обратно в поле ввода
End;
end;

OnChange использовать не надо, потому что если Вы захотите ввести туда число 12, то проверка будет происходить когда Вы введете 1 и потом снова, когда введете 2.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 12.05.2007, 15:17
Оценка за ответ: 3
Комментарий оценки:
А если ввести символ, а не число?
Не универсально.

Отвечает: DimonSoft
Здравствуйте, Null!

Ответы уже есть, но вставлю и я свои пять копеек. IMHO, вариантов решения проблемы несколько...

1. Написать свой компонент-контрол, в котором реализовать запрет на ввод чисел не из промежутка 1..12. Наследуемся от TCustomEdit - и вперёд. И я бы не сказал, что это будет очень уж громоздко.

2. Этим вариантом я сам пользовался в программе, которую писал к 1 апреля (прикол с возможностью настроить дату срабатывания). Вместо TEdit воспользуйтесь TComboBox, в свойствах проставьте DropDownList, укажите числа от 1 до 12 или, ещё лучше, названия месяцев.

3. Попробуйте TSpinEdit со свойствами MinValue и MaxValue 1 и 12 соответственно. Включите ReadOnly - и все проблемы решены.

4. Организуйте взаимодействие двух TButton (как вариант, TUpDown) и TLabel'а (или любого другого контрола). По нажатия кнопок TUpDown'а (или отдельных TButton'ов) изменяйте Caption TLabel'а и значение некоторой переменной (по вкусу :)).

Кто ищет, тот найдёт. Смелее экспериментируйте, а если возникнут проблемы - RusFAQ не подведёт.

Удачи!!!
Ответ отправил: DimonSoft (статус: 2-ой класс)
Ответ отправлен: 12.05.2007, 15:19
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо, сейчас попробую.

Отвечает: W@NDeReR
Здравствуйте, Null!

Вот пример ввода данных в несколько Edit
В раздел Private пишете новую процедуру что то типа такой;
procedure EditKeyPress(Sender: TObject; var Key: Char);
Затем нажимаете Ctrl+Shift+C и в появившей процедуре пишите
If Key in ['a'..'z']+['A'..'Z']+['а'..'я']+['А'..'Я'] then
Key:=#0;
здесь если нажата клавиша из этих промежутков то ничего не нажато

Дальше при событии onCreate формы пишите:
var
i: integer;
begin
for i:=1 to 5 do
Tedit(FindComponent('Edit'+InTTostr(i))).OnKeyPress:=EditKeyPress;
Т.к вы не указали сколько у вас Edit этот пример засчитан на 5 если нужно больше или меньше то изменить число 5 в цикле на число Edit
---------
Опыт — дитя мысли, а мысль — дитя действия. Нельзя учиться по книгам.
Ответ отправил: W@NDeReR (статус: 4-ый класс)
Ответ отправлен: 12.05.2007, 19:42
Оценка за ответ: 5

Отвечает: Johnny Superb
Здравствуйте, Null!
Вам нужно сделать следующее:
Создайте для одного из TEdit обработчик, а у остальных Edit-ов сделайте ссылку на него в свойстве onChange.
procedure TForm1.Edit1Change(Sender: TObject);
var i: integer;
begin
try
i:=strtoint((Sender as TEdit).Text);
except
ShowMessage('Введите целое число!');
(Sender as TEdit).Text:='';
exit;
end;
if (i>12)or(i<1) then
begin
ShowMessage('Введите число от одного до двенадцати!');
(Sender as TEdit).Text:='';
exit;
end;
где (Sender as TEdit) это объект типа TEdit, вызвавший процедуру Edit1Change
Ответ отправил: Johnny Superb (статус: 1-ый класс)
Ответ отправлен: 12.05.2007, 22:33
Оценка за ответ: 5


Вопрос № 86.620
Здравствуйте уважаемые эксперты.
1) Как сделать, чтобы программа находила окно и посылала туда текст.
2) Как можно перенести тект из моей программы в другую с помощью перетаскивания.
Отправлен: 12.05.2007, 20:50
Вопрос задала: Бушманова Ирина Юрьевна (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Gh0stik
Здравствуйте, Бушманова Ирина Юрьевна!

1) Это можно сделать при помощи функции SendMessage(). Вот ветка на которой описано каким образом можно решит Ваш вопрос.

2) Вопрос весьма объемен - отвечая на него можно написать не одну статью. Потому я Вам рекомендую прочитать ряд статей по данной тематике, в статьях рассмотрены программная реализация Drag and Drop.

# Переслать данные в другую программу методом Drag-and-Drop
# Drag and Drop - как использовать ItemAtPos для получения элемента DirListBox
# Drag and Drop TImage
# Drag and Drop c Win95 Explorer
# Drag and Drop c Win95 Explorer 2
# Drag and Drop для TListBox на примере двойного списка
# Drag and Drop для двух компонентов TOutline
# Drag and Drop из RichEdit
# Drag and Drop из TScrollBox
# Drag and Drop между двумя компонентами ListBox
# Drag and Drop несколько элементов в TListView
# Drag and Drop с минимизированным приложением
# Drag and Drop со списками


Good Luck!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Профессионал)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 13.05.2007, 02:10
Оценка за ответ: 4
Комментарий оценки:
Спасибо за ответ



Отвечает: W@NDeReR
Здравствуйте, Бушманова Ирина Юрьевна!

По первому вопросу.
Находим окно
var
Window,Edit: HWND;
begin
Window:=FindWindow(nil,'Безымянный - Блокнот'); //ишем окно по заголовку или можно по классу если вместо nil в первом параметре вписать класс окна(для блокнота notepad) а второму параметру присвоить nil
Edit:=FindWindowEx(window,0,'Edit',nil); //Теперь в найденом окне ишем поле ввода
sendMessage(edit,WM_SETTEXT,0,lparam(LPCTSTR(PcHar(Edit1.text))));//Посылаем найденому полю ввода в блокноте текст из Edit1(String переменная или memo)
---------
Опыт — дитя мысли, а мысль — дитя действия. Нельзя учиться по книгам.
Ответ отправил: W@NDeReR (статус: 4-ый класс)
Ответ отправлен: 13.05.2007, 10:31
Оценка за ответ: 5
Комментарий оценки:
Спасибо за ответ


Вопрос № 86.628
Здравствуйте!
Есть текстовый файл, со строками примерно такого формата:
#ключ R G B A "M" ///comment
Где R,G,B,A - числовые значеня, M - текст.
Задача: необходимо прочитать файл, выбрать ключи (начинаются символом #, заканчиваются либо пробелом, либо табуляцией, всегда первое слово в строке) и поместить в список (listbox, combobox, не важно), остальные значения записать в переменные, которые можно редактировать и записать обратно в файл.
Вопрос:
1 Подскажите, пожалуйста, пример работы с текстовым файлом (построчное чтения, поиск опр символов, сохранение).
2 Можно ли записывать в переменные данные только одной строки, которая выбрана в списке?
Отправлен: 12.05.2007, 22:02
Вопрос задал: Serj.a (статус: 5-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: DimonSoft
Здравствуйте, Serj.a!

IMHO, в Delphi самый лучший способ обработки и хранения текстовой информации - TStringList. Итак, что приблизительно делаем...

SomeTextFile:=TStringList.Create;
SomeTextFile.LoadFromFile("YourFile.txt");
{Вот здесь можно всё, что угодно вытворять, например, так:}
SomeListBox.Items.Assign(SomeTextFile);
SomeTextFile.Free;

По выбору одного из элементов списка (например, в OnClick) просто читаем SomeListBox.ItemIndex и обрабатываем строку SomeListBox.Items[SomeListBox.ItemIndex] или SomeTextFile[SomeListBox.ItemIndex]. Второе возможно только если не удалять SomeTextFile сразу после загрузки элементов списка.

Разбор строки... Я в таких случаях не брезгую элементарным проходом строки посимвольно или с помощью функции Pos(). Там на самом деле особенно сложного ничего нет: определили конец очередного куска строки, скопировали значение в отдельную переменную, этот кусок строки удалили из самой строки, операцию повторили.

Удачи!!!
Ответ отправил: DimonSoft (статус: 2-ой класс)
Ответ отправлен: 12.05.2007, 22:10
Оценка за ответ: 4
Комментарий оценки:
Получил в листбоксе текст без пробелов, работаю над фильтром...

Отвечает: Johnny Superb
Здравствуйте, Serj.a!
Ваш вопрос задан слишком туманно. Поэтому предположим, что все данные из текстового файла будут сохранены в динамический массив, а от туда вы их сможете потом взять и обработать как вашей душе угодно. И так. Создайте новый проект, разместите ListBox1 и Button1. Создайте обработчик нажатия кнопки и перенесите всю недостающую информацию из указанного приложения ниже.
Обязательно создайте файл 1.txt. Я проверял на следующих входных данных.
#1 2 3 4 5 "troka" ///vfa
#2 2 3 4 5 "sroka" /// fdsaf
#3 2 3 4 5 "oka" /// afsd
#4 2 3 4 3 "sta" ///f asd
#5 2 3 0 5 "stoka" /// asdf
#6 2 9 4 5 "stok" /// asdf
#7 6 3 4 5 "ska" /// adsf
Если вам нужно будет обратится к записи, выбранной в ListBox1, то это можно будет сделать примерно так:
k:=infa[ListBox1.itemindex].int[1]; //присвоить k значение R выбранной записи
Построчное и посимвольное чтение в файле показано на примере моей программы, а с остальными функциями, такими как (Seek, SeekEoln, SeekEof - работа с файлами), (pos, delete, insert, copy...- работа со строками) вы можете подробно ознакомится в любом издании по Паскалю или Делфи.

Приложение:

Ответ отправил: Johnny Superb (статус: 1-ый класс)
Ответ отправлен: 13.05.2007, 00:11
Оценка за ответ: 4
Комментарий оценки:
Добился открытия файла, опишу конкретнее файл и то, что должно получиться на минифоруме.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.52 от 02.05.2007
Яндекс Rambler's Top100

В избранное