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

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


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

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

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

Выпуск № 384
от 13.02.2006, 06:12

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


Вопрос № 34917: Уважаемые Эксперты, подскажите пожалуйста способы, с помошью которых можно сохранять RTF файлы в базу данных Access....
Вопрос № 34922: Здравствуйте. Есть ли в Delphi функция или процедура заменяющая символы в строке. Например мне надо в строке "-12.5" символ "." заменить на ''," Как это возможно реализовать с помощью одной функции/процедуры?<br...
Вопрос № 34959: Здравствуйте, эксперты. Появилась необходимость зделать браузер с ограничиными фанкциями, то есть чтобы не было доступа к жёсткому диску... Так вот решил я использовать компонент TWebBrowser и всё вроде получалось, но вот возникла проблема: п...
Вопрос № 34983: Здравствуйте, Уважаемые эксперты! Как реализовать в программе на Delphi поддержку горячих клавиш (Например как завершить программу при нажатии на Ctrl+X) ...

Вопрос № 34.917
Уважаемые Эксперты, подскажите пожалуйста способы, с помошью которых можно сохранять RTF файлы в базу данных Access.
Отправлен: 07.02.2006, 11:01
Вопрос задал: Дружин Игорь Владимирович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, Дружин Игорь Владимирович!
Можно записать его в BLOB-поле:
(Table1.FieldByName('BlobField') as TBlobField).LoadFromFile('file.rtf');
Однако, если важна будет скорость обработки данных, то лучше сам файл хранить на диске в каком-нибудь каталоге, а в таблицу записать лишь путь к файлу:
RichEdit1.Lines.LoadFromFile(Table1.FieldByName('PathOfFile').AsString);
{Загрузка файла в RichEdit для просмотра}
Ответ отправил: sir henry (статус: Академик)
Отправлен: 07.02.2006, 12:09

Отвечает: Leshiy2006
Здравствуйте, Дружин Игорь Владимирович! Устанавливаете на форме RichEdit делаете его невидимым грузите RTF файл а затем просто переносите текст в DBRichEdit и подтерждаете изменения в базе
Ответ отправил: Leshiy2006 (статус: 1-ый класс)
Отправлен: 07.02.2006, 23:47


Вопрос № 34.922
Здравствуйте. Есть ли в Delphi функция или процедура
заменяющая символы в строке. Например мне надо в строке "-12.5" символ "." заменить на '',"

Как это возможно реализовать с помощью одной функции/процедуры?

Отправлен: 07.02.2006, 12:03
Вопрос задал: Александр_10289 (статус: Посетитель)
Всего ответов: 10
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, Александр_10289!
Отчего же нету - есть. :)
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
Заменяет в строке S подстроку OldPattern на NewPattern.
В Вашем случае можно сделать так:
var
s: string;
Begin
s:='12.5';
s:=StringReplace(S, '.', ',', rfReplaceAll);
End;
Ответ отправил: sir henry (статус: Академик)
Отправлен: 07.02.2006, 12:20

Отвечает: Евгения
Здравствуйте, Александр_10289!

http://www.delphibasics.co.uk/RTL.asp?Name=StringReplace (тут и другие посмотри)

Существует функция StringReplace

function StringReplace ( const SourceString, OldPattern, NewPattern : string; Flags : TReplaceFlags ) : string;

Приложение:

Ответ отправила: Евгения (статус: 1-ый класс)
Отправлен: 07.02.2006, 12:28

Отвечает: Ерёмин Андрей
Здравствуйте, Александр_10289!
Легко:
uses StrUtils;
...
Str:=AnsiReplaceStr(Str,'.',',');
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 07.02.2006, 12:31

Отвечает: Kazakh
Здравствуйте, Александр_10289!
примерно так
s:='-12.5'
pos('.', s) будет равно 4.
Ответ отправил: Kazakh (статус: 3-ий класс)
Отправлен: 07.02.2006, 15:50

Отвечает: Jadd
Здравствуйте, Александр_10289!
Кроме библиотечных функций, можно делать так:

str:='-12.5';
i := Pos('.', str);
if i > 0 then
str[i] := ',';

Примерно так.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 07.02.2006, 16:30

Отвечает: Schmak
Здравствуйте, Александр_10289!
Можно попробовать вот так:
var s:string;
begin
while pos('.',s)<>0 do
s[pos('.',s)]:=','
end.
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Практикант)
Отправлен: 07.02.2006, 16:34

Отвечает: Diman_A
Здравствуйте, Александр_10289!
В приложении функция replace, которая делает то, что тебе нужно, и пример использования для строки '-12.5' (заменяем '.' на ',').

Приложение:

Ответ отправил: Diman_A (статус: 5-ый класс)
Отправлен: 07.02.2006, 16:49

Отвечает: REFERI
Здравствуйте, Александр_10289!
Вот я вам составил такую процедуру, т.к. в средствах языка это не предусмотрено.

var s,d: string;
i: integer;
begin
i:=1;
s:='-12.5';
while i if s[i]='.' then s[i]:=',';
write(s[i]);
i:=i+1;
end;
readln;
end.

---------
Не судите, да не судимы будете...
Ответ отправил: REFERI (статус: Практикант)
Отправлен: 07.02.2006, 16:52

Отвечает: Ataman N. N.
Здравствуйте, Александр_10289!
function ChangeSimvol(Str: String; Simvol: Char): String;
var i: Integer;
begin
Result := '';
for i := 1 to Length(Str) do
if Str[i] = Simvol then
Result := Result + Simvol
else
Result := Result + Str[i];
end;
Ответ отправил: Ataman N. N. (статус: 6-ой класс)
Отправлен: 07.02.2006, 17:50

Отвечает: Злоумышленник
Здравствуйте, Александр_10289!
Есть такая партия! Пардон, способ:
procedure TForm1.Button1Click(Sender: TObject);
function ReplaceSub(str, sub1, sub2: String): String;
var
aPos: Integer;
rslt: String;
begin
aPos := Pos(sub1, str);
rslt := '';
while (aPos <> 0) do begin
rslt := rslt + Copy(str, 1, aPos - 1) + sub2;
Delete(str, 1, aPos + Length(sub1) - 1);
aPos := Pos(sub1, str);
end;
Result := rslt + str;
end;
begin
Edit1.Text := ReplaceSub(Edit1.Text, '.', ',');
end;
---------
Почему нет встроенного языка 1С на мордовском? Было бы клёво!
Ответ отправил: Злоумышленник (статус: 2-ой класс)
Отправлен: 07.02.2006, 18:13


Вопрос № 34.959
Здравствуйте, эксперты.
Появилась необходимость зделать браузер с ограничиными фанкциями, то есть чтобы не было доступа к жёсткому диску...
Так вот решил я использовать компонент TWebBrowser и всё вроде получалось, но вот возникла проблема: при открытии ссылки в новом окне открывается новое(как ни странно:)) окно Internet Explorer'а. Как мне сделать чтобы новое окно не открывалось, а ссылка по которой хотят перейти открывалось в моём окне(иными словами чтобы все ссылки открывались в одном окне)???
Пожалуйста, помогите, срочно надо!!!!!!
Отправлен: 07.02.2006, 19:10
Вопрос задал: Dushin Igor (статус: 5-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Leshiy2006
Здравствуйте, Dushin Igor! Я бы посоветовал бы такой способ: установите для TWebBrowser свое
PopupMenu или используйте событие OnBeforeNavigate2 там можно получить URL ссылки и разрешить или запретить переход.
Удачи!
Ответ отправил: Leshiy2006 (статус: 1-ый класс)
Отправлен: 07.02.2006, 23:38


Вопрос № 34.983
Здравствуйте, Уважаемые эксперты!
Как реализовать в программе на Delphi поддержку горячих клавиш
(Например как завершить программу при нажатии на Ctrl+X)
Отправлен: 08.02.2006, 03:11
Вопрос задал: Solovej (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Злоумышленник
Здравствуйте, Solovej-Razboynik!
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key = ord('X')) and (ssCtrl in Shift) then Close
end;
Не помешает поставить в инспекторе объектов св-во формы KeyPreview в true
---------
Почему нет встроенного языка 1С на мордовском? Было бы клёво!
Ответ отправил: Злоумышленник (статус: 2-ой класс)
Отправлен: 08.02.2006, 03:30
Оценка за ответ: 5

Отвечает: Евгения
Здравствуйте, Solovej!

Cобытие OnKeyPress
Событие OnKeyPress возникает , при нажатии клавиши на клавиатуре
TKeyPressEvent = procedure (Sender: TObject; var Key: Char) of object;
Параметр Key содержит ASCII код нажатой клавиши.Для клавиш которые
не имеют ASCII кода это событие не наступает.Для обработки таких клавиш
используются события OnKeyUp и OnKeyDown
Для получения ASCII кода нажатой клавиши используется
преобразование Chr(Key)
Пример : if Chr(Key)='A' then ...

Примечание :для того чтобы форма первой получала это событие необходимо
установить свойство формы KeyPreview=true
Cобытие OnKeyDown
Событие OnKeyDown возникает как и событие OnKeyPress ,
при нажатии клавиши на клавиатуре.Но обработчик этого события
получает еще информацию о состоянии клавиш Shift, Alt, Ctrl ,f
а также о нажатой кнопке мыши.Информация о клавишах передается в
параметре key типа Word .Для определения какая именно клавиша нажата
необходимо использовать коды виртуальных клавиш.
Пример определим нажата ли комбинация клавиш Alt+F10
Procedure Tform1.FormKeyDown(Sener ....)
begin
if ((Shift=[ssAlt] and (key=VK_F10)) t hen
ShowMessage('Нажата комбинация клавиш Alt+F10');
end;

Возможные значения параметра Shift :

ssShift Нажата клавиша Shift
ssAlt Нажата клавиша Alt
ssCtrl Нажата клавиша Ctrl
ssLeft Нажата левая клавиша мышки
ssRight Нажата правая клавиша мышки
ssMiddle Нажата средняя клавиша мышки
ssDouble Нажата левая и правая клавишы мышки

Пример :определить нажатие кнопки Insert
if Key=vk_Insert then showMessage('Нажата клавиша Insert');
После того как пользователь отпустил клавишу наступает событие OnKeyUp

Примечание :для того чтобы форма первой получала это событие необходимо
установить свойство формы KeyPreview=true
Cобытие OnKeyUp
Событие OnKeyUp возникает когда пользователь отпустил нажатую клавишу
на клавиатуре ,или мышки. Т .е.оно возникает строго после события
OnKeyDown также как и в OnKeyDown есть возможность получить информацию
о состоянии клавиш Shift, Alt,, Ctrl
Примечание :для того чтобы форма первой получала это событие необходимо
установить свойство формы KeyPreview=true

Приложение:

Ответ отправила: Евгения (статус: 1-ый класс)
Отправлен: 08.02.2006, 03:56
Оценка за ответ: 5
Комментарий оценки:
Спасибо за подробный ответ

Отвечает: Diman_A
Здравствуйте, Solovej!
Так происходит обнаружение нажатия клавиш в вашем приложении:
установи keypreview=true!
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
ShiftState: TShiftState);
begin
if (Chr(Key)='X') AND (vk_ctrl in shiftstate) then Close
end;
А вот так - создание системных горячих клавиш (ctrl+alt+F12):
RegisterHotkey(Handle, 1, mod_alt or mod_control, vk_f12);
И их обработка:
procedure TForm1.WMHotkey( var msg: TWMHotkey );
begin
if msg.hotkey = 1 then
begin
close;
BringToFront;
end;
end;
Не забудьте поместить procedure WMHotkey( var msg: TWMHotkey ); message WM_HOTKEY; в секцию private.
Ответ отправил: Diman_A (статус: 5-ый класс)
Отправлен: 08.02.2006, 12:45
Оценка за ответ: 5
Комментарий оценки:
Спасибо!

Отвечает: Ерёмин Андрей
Здравствуйте, Solovej!
Ставим Form.KeyPreview = True. Затем событие Form.OnKeyDown:
If (Key = Ord('X')) And (ssCtrl in Shift) Then Form1.Close;
Надеюсь, что вы не перепутали горячие и глобальные комбинации клавиш.
Если нужно обрабатывать нажатие клавиш во всей системе, нужно использовать хуки (hooks). Подробные примеры есть во многих документациях - DRKB например.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 08.02.2006, 14:58
Оценка за ответ: 5

Отвечает: Leshiy2006
Здравствуйте, Solovej! Возможны два спосба:
1) Создайте MainMenu в нем пункт "Выход" обрабатываете его Form1.Close;
у пункта меню есть свойство ShortCut;
2) Используйте событие OnKeyDown предварительно установив свойство KeyPreview равны True
if (ssCtrl in Shift) and (chr(key)='X') then Form1.Close;
P.S. в первом способе если меню вам не нужно Вы можете его скрыть.
во втором способе можете вместо Form1.Close; использовать Application.Terminate;
Удачи!
Ответ отправил: Leshiy2006 (статус: 1-ый класс)
Отправлен: 08.02.2006, 23:32
Оценка за ответ: 5


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.14 (бета) от 09.02.2006
Яндекс Rambler's Top100

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное