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

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


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

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

Выпуск № 921
от 11.09.2007, 06:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 469, Экспертов: 84
В номере:Вопросов: 5, Ответов: 18


Вопрос № 100912: пожалуйста помогите! делаю проект на делфи появился вопрос: как сделать с компонетами Edit и Memo так что у них Enabled было бы равно True и если на них нажать то курсора в окне бы не появилось и текст выделить или изменить было бы нельзя? За...
Вопрос № 100962: Уважаемые эксперты! Помогите написать программу: по дате рождения определить количество полных прожитых дней (с учетом високосных годов). Заранее спасибо!...
Вопрос № 100964: Здравствуйте! Как отловить нажатия клавиш в Делфи? Причем я хочу чтобы если клавиша удерживалась то это считалось за много нажатий. Заранее спасибо. ...
Вопрос № 100967: Здравствуйте, Уважаемые эксперты!!! Помогите, пожалуйста, с массивами. Есть программка, которая выводит номера и названия дней недели, хранящиеся в массиве Day. Скажите, как эту программку правильно написать в Delphi? Как вывести массив в поле Me...
Вопрос № 100987: Здравствуйте уважакмые! У меня к Вам следующий вопрос.В своём приложении ТOpenDialog - ом я выбираю необходимый мне файл,далее программа сама должна скопировать его в нужную мне директорию(пусть Dir:String),при этом переименовав файл (пусть в FileNam...

Вопрос № 100.912
пожалуйста помогите! делаю проект на делфи появился вопрос:
как сделать с компонетами Edit и Memo так что у них Enabled было бы равно True и если на них нажать то курсора в окне бы не появилось и текст выделить или изменить было бы нельзя?
Заранее спасибо
Отправлен: 05.09.2007, 12:56
Вопрос задал: Дрижило Дмитрий Александрович (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Shveps
Здравствуйте, Дрижило Дмитрий Александрович
практически у всех компонетов, которые редактируют данные есть свойство ReadOnly, выставив которое в True вы запретите редактирование. Вот код, который меняет курсор, в зависимоти от разрешения-запрещения редактировать данный Edit:

procedure TForm1.Edit1Click(Sender: TObject);
begin
if Edit1.ReadOnly = true then
Edit1.Cursor := crNo
else
Edit1.Cursor := crDefault;
end;
---------
Пиво ф топку !!! Водку Тоже !!!
Ответ отправил: Shveps (статус: 10-ый класс)
Ответ отправлен: 05.09.2007, 13:08

Отвечает: Delph
Здравствуйте, Дрижило Дмитрий Александрович!

У этих компонентов есть событие OnEnter. Сделайте обработчик на него (инспектор объектов ==> Events ==> OnEnter (двойной щелчок)), в нём сбрасывайте фокус на какой-нибудь другой компонент. Напремер, так:

StartButton.SetFocus;

После этого Ваши компоненты будут мгновенно избавляться от фокуса активности, и изменить их содержимое станет весьма проблематично (пока Вы сами этого не позволите). Ну и тот способ с ReadOnly, что указал Shveps, тоже заслуживает внимания.
---------
Сомневайся во всём! Реальность часто бывает не такой, как мы о ней думаем.
Ответ отправил: Delph (статус: 8-ой класс)
Ответ отправлен: 05.09.2007, 13:12

Отвечает: Дмитрий С.
Здравствуйте, Дрижило Дмитрий Александрович!
Для таких целей советую использовать компонент Label
---------
Наши программисты самые программистые программисты!..
Ответ отправил: Дмитрий С. (статус: 3-ий класс)
Ответ отправлен: 05.09.2007, 13:25

Отвечает: Omickron
Здравствуйте, Дрижило Дмитрий Александрович!

У этих компонентов есть свойство ReadOnly типа Boolean. Если оно будет true, изменить значение поля будет нельзя. По умолчанию стоит False.
Ответ отправил: Omickron (статус: 3-ий класс)
Ответ отправлен: 05.09.2007, 14:06

Отвечает: Решетник Д
Здравствуйте, Дрижило Дмитрий Александрович!
Delph предложил хороший вариант. только вот к нему стоит добавить что-то типа такого:


procedure TForm1.Memo1ContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
begin
Handled := true;
end;

так как без такой вставки можно скопировать весь текст через контекстное меню.
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: Студент)
Ответ отправлен: 05.09.2007, 14:24


Вопрос № 100.962
Уважаемые эксперты! Помогите написать программу: по дате рождения определить количество полных прожитых дней (с учетом високосных годов). Заранее спасибо!
Отправлен: 05.09.2007, 17:39
Вопрос задал: Шурик (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, Шурик!
В типе TDateTime то, что лежит до запятой, это как раз и есть количество дней. Так что результат в днях Вы можете получить просто вычтя из одной даты другую. Например:

{$APPTYPE CONSOLE}
Var
strdate: string; //Сюда будет вводится строка даты рождения
td: TdateTime; //
Begin
WriteLn('Введите дату рождения:');
ReadLn(strdate);
Try
td:=StrToDateTime(strdate);
WriteLn('С рождения прошло дней: ', Round(Now-td));
Except
WriteLn('Такой даты не бывает!');
End;
End.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 05.09.2007, 20:19
Оценка за ответ: 4

Отвечает: Тоха
Здравствуйте, Шурик!
Хм...интересная програмка я занимался программой наподобие тоже учитывал многое. Можешь прожку глянуть http://dom2003bk.narod.ru/ вот на этом сайте называется Chronology Evolution.
Исходник есть могу подкинуть. Если интересно пиши. Удачи!
---------
Я не волшебник я только учусь!
Ответ отправил: Тоха (статус: 5-ый класс)
Ответ отправлен: 06.09.2007, 12:08


Вопрос № 100.964
Здравствуйте! Как отловить нажатия клавиш в Делфи? Причем я хочу чтобы если клавиша удерживалась то это считалось за много нажатий.
Заранее спасибо.
Отправлен: 05.09.2007, 17:56
Вопрос задал: Дрижило Дмитрий Александрович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Omickron
Здравствуйте, Дрижило Дмитрий Александрович!

Попробуйте отслеживать события OnKeyDown и OnKeyUp на форме.
Это - простой способ.

Если же Вы хотите отслеживать нажатия клавиш не только в своём приложении, тогда придётся использовать хуки (hooks, ловушки). Информацию об этом можно найти на RusFAQ.ru, на Delphikingdom.com и на wasm.ru. Удачи.
Ответ отправил: Omickron (статус: 3-ий класс)
Ответ отправлен: 05.09.2007, 19:47

Отвечает: Delph
Здравствуйте, Дрижило Дмитрий Александрович!

Кроме событий OnKeyDown и OnKeyUp, указанных Omickron'ом, есть ещё событие OnKeyPress, которое в ряде случаев более удобно. В него передаются 2 параметра: (Sender: TObject; var Key: Char). В параметре Key Вы сможете найти тот символ, который был нажат. При длительном нажатии клавиши событие вызывается многократно. Если нужно подавить добавление символа к той строке, что уже сформирована, можно применить оператор: Key := #0; Комбинируя обработку OnKeyPress с событиями OnKeyDown и OnKeyUp, можно отслеживать и длительность нажатия клавиши: в OnKeyDown установить определённый Вами флаг нажатия клавиши (можно указать и время), а в OnKeyUp его сбросить (можно сравнить время нажатия клавиши с текущим, чтобы узнать длительность нажатия).
---------
Сомневайся во всём! Реальность часто бывает не такой, как мы о ней думаем.
Ответ отправил: Delph (статус: 8-ой класс)
Ответ отправлен: 06.09.2007, 08:29

Отвечает: Дмитрий С.
Здравствуйте, Дрижило Дмитрий Александрович!
Если Вы используете в приложении форму, то нажатые клавиши отлавливаются событием OnKeyPress, а если клавиша удерживается, то Вам пригодится событие OnKeyDown.
В обоих процедурах идёт "встроенная" переменная key типа char, которая содержит символ нажатой (удерживаемой) клавиши.
---------
Наши программисты самые программистые программисты!..
Ответ отправил: Дмитрий С. (статус: 3-ий класс)
Ответ отправлен: 06.09.2007, 12:20


Вопрос № 100.967
Здравствуйте, Уважаемые эксперты!!! Помогите, пожалуйста, с массивами. Есть программка, которая выводит номера и названия дней недели, хранящиеся в массиве Day.
Скажите, как эту программку правильно написать в Delphi? Как вывести массив в поле Memo? И можно ли еще в какой-нибудь компонент вывести массив (и если не трудно, покажите как)? Заранее спасибо Вам БОЛЬШОЕ!

Приложение:

Отправлен: 05.09.2007, 19:00
Вопрос задала: Алена (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Виктор Пырлик
Здравствуйте, Алена!

В приложении дан код.
Для этого, положите на форму компонент TMemo и одну кнопку, потом щелкните по кнопке попадете уже в код, который я вам написал. Всё.. пробуйте, смотрите..

Приложение:

---------
Если ничего не помогло - надо читать инструкцию

Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 05.09.2007, 19:19
Оценка за ответ: 5

Отвечает: Shurka
Привет!
Memo - это объект типа TMemo. Как у всякого другого объекта в Delphi, у него есть свои свойства и методы, полный перечень которых можно посмотреть в справке. В вашем случае нужно использовать свойство Lines типа TStrings, который кстати также является объектным и представляет собой что-то типа списка строк . У объектов типа TStrings есть метод Add(s: String) параметром которого является строка. Этот метод добавляет строку в список. Как известно, чтобы обращение к свойству или методу объекта осуществляется так: <Имя объекта>.<имя свойства или метода>.
Теперь пишем код: (например в процедуре нажатия на какую-нибудь кнопку) (массив можно объявить и инициализировать также как вы сделали)
for i:= 1 to 7 do
Memo1.Lines.Add(day[i]);

Кроме Memo можно использовать компонент RichEdit, у которого тоже есть свойство Lines, то есть тогда код будет выглядеть так:
for i:= 1 to 7 do
RichEdit1.Lines.Add(day[i]) ;

Еще можно пользоваться компонентой ListView, но там все сложнее немного
for i:= 1 to 7 do
(ListView1.Items.Add).Caption:= day[i];
Здесь в скобках мы обращаемся к свойству Items объекта ListView1. Получаем объект ListView1.Items у него мы вызываем функцию Add, которая добавляет в список новую строку и возвращает ее. Таким образом, выражение в скобках - это только что добавленная к списку строка. Она в свою очередь тоже является объектом :) и мы
изменяем ее заголовок (ее свойство Caption).

Кстати, есть еще тысяча способов сделать это, но про них догадывайся сама. Удачи!
Ответ отправил: Shurka (статус: 3-ий класс)
Ответ отправлен: 06.09.2007, 10:23
Оценка за ответ: 5
Комментарий оценки:
Спасибо Вам БОЛЬШОЕ!!!:-) И Вам удачи!!!;-)

Отвечает: Дмитрий С.
Здравствуйте, Алена!
Чтобы добавлять строки в МЕМО существует процедурка:

YOUR_MEMO_NAME.Lines.Add('String_fod_add');

В Вашем случае советую завести на форме 1 поле МЕМО (обзовём его стандартным именем - МЕМО1) и кнопочку Button (Button1). В событии OnClick Вашей кнопки прописываем ЛИСТИНГ (см.в приложении).

Аналогичную операцию можно проделать с объектом ListBox

Приложение:

---------
Наши программисты самые программистые программисты!..

Ответ отправил: Дмитрий С. (статус: 3-ий класс)
Ответ отправлен: 06.09.2007, 12:12
Оценка за ответ: 5
Комментарий оценки:
Спасибо!


Вопрос № 100.987
Здравствуйте уважакмые! У меня к Вам следующий вопрос.В своём приложении ТOpenDialog - ом я выбираю необходимый мне файл,далее программа сама должна скопировать его в нужную мне директорию(пусть Dir:String),при этом переименовав файл (пусть в FileName:String).Как это осуществить?
Отправлен: 05.09.2007, 21:46
Вопрос задал: Зотов Геннадий Александрович (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: PGM
Здравствуйте, Зотов Геннадий Александрович!

Есть такая функция в Wind32 API - CopyFile. Для вашего случая будет что-то типа
CopyFile(PChar(OldFileName), PChar(Dir+FileName), False).

P.S. Последний флаг для того чтобы управлять реакцией на случай, если целевой файл уже существует.

Ответ отправил: PGM (статус: 9-ый класс)
Ответ отправлен: 05.09.2007, 22:22
Оценка за ответ: 5
Комментарий оценки:
Спасибо то что надо

Отвечает: Виктор Пырлик
Здравствуйте, Зотов Геннадий Александрович!

В приложении дан пример. Два варианта - с помощью диалогов, и второй - задаём имя сами.

Приложение:

---------
Если ничего не помогло - надо читать инструкцию

Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 05.09.2007, 22:49
Оценка за ответ: 5
Комментарий оценки:
Спасибо за примеры

Отвечает: Omickron
Здравствуйте, Зотов Геннадий Александрович!

Для копирования файла можно использовать функцию CopyFile. Для уверенности, лучше передавать ей абсолютные пути к файлам.

//на случай, если путь не оканчивается обратным слешем
if FileName[Length(FileName)]<>'' then FileName:=FileName+'';
CopyFile (PChar(Form1.OpenDialog1.FileName),PChar(Dir+FileName),false);

Приложение:

Ответ отправил: Omickron (статус: 3-ий класс)
Ответ отправлен: 05.09.2007, 23:09
Оценка за ответ: 5
Комментарий оценки:
спасибо за подробное описание

Отвечает: Shurka
Здравствуйте, Зотов Геннадий Александрович!
Проще некуда если писать под Win.
Используем WInAPI функцию CopyFile. Вот на нее досье

The CopyFile function copies an existing file to a new file.

BOOL CopyFile(

LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);


Parameters

lpExistingFileName

Points to a null-terminated string that specifies the name of an existing file.

lpNewFileName

Points to a null-terminated string that specifies the name of the new file.

bFailIfExists

Specifies how this operation is to proceed if a file of the same name as that specified by lpNewFileName already exists. If this parameter is TRUE and the new file already exists, the function fails. If this parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds.

В приложении преобразование PChar(string) нужно потому, что WIndows использует строки типа PChar а не string.

Приложение:

Ответ отправил: Shurka (статус: 3-ий класс)
Ответ отправлен: 06.09.2007, 10:25
Оценка за ответ: 4
Комментарий оценки:
хоть и правильный ответ но вы уже не первый и даже не второй его даёте

Отвечает: Denisss

Здравствуйте, Зотов Геннадий Александрович!

В приложении выложил функцию для копирования файлов.

Пример использования функции:

if not FileCopy(OpenDialog1.FileName,
  IncludeTrailingBackSlash(Dir) + FileName)
then
  ShowMessage('Не могу скопировать файл');

Приложение:

Ответ отправил: Denisss (статус: Профессионал)
Россия, Москва
----
Ответ отправлен: 06.09.2007, 11:27
Оценка за ответ: 5
Комментарий оценки:
за IncludeTrailingBackSlash спасибо запомню


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.58 от 10.09.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное