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

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


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

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

Выпуск № 410
от 11.03.2006, 15:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 266, Экспертов: 66
В номере:Вопросов: 7, Ответов: 12


Вопрос № 36816: Здравствуйте Уважаемые эксперты! Подскажите пожалуйста как решить проблему в 7 версии такого рода: Эта версия позваляет использовать jpg файлы в базах данных, но у меня не получается их использование в грид таблице, что бы одновременно видеть...
Вопрос № 36830: Доброго времени суток, уважаемые эксперты! Подскажите, пожалуйста, как с помощью возможностей Delphi можно узнать установлен ли пароль для документа Word. Спасибо за ответы....
Вопрос № 36831: Здравствуйте господа, есть вопрос, а как можно сделать, что б при щелчке мыши в проводнике на файл исх. данных, открылась моя программа и загрузила данные из этого фала. На подобие если выбрать файл txt то открывается блокнот с этим файлом. Я пробова...
Вопрос № 36832: Здравствуйте, уважаемые эксперты. Давно меня мучает 2 вопроса (возможно, взаимосвязаных): 1. Почему при перетаскивании окна все процедуры прерываются. пока окно не отпустишь, и как этого избежать ? 2. Что такое "потоки" (если эт...
Вопрос № 36847: Здраствуйте. Вопрос такой: Есть таблица (StringGrid), у каждого столбца есть имя(Задаётся в нулевой строке), это имя изменяется в зависимости от языка, при выборе ячейки на её месте должна показывается Edit, DateTimePicker, ComboBox, ну и т.д., в...
Вопрос № 36854: Добрый день. Можете подсказать, как сделать чтобы форма прокручивалась скролером. Т. е. есть форма. Появляеться вертикальный скролер, содиржимое окна увеличивает. Но при этом не реагирует на скролер мыши. Как это можно исправить....
Вопрос № 36876: Доброго времени суток, уважаемые эксперты! Подскажите как посредствами делфи (7) наложить водяной знак на изображение (gif, jpg,png и т.п.) Может кто знает где можно компонент найти выпоняющий такую функцию! Спасибо....

Вопрос № 36.816
Здравствуйте Уважаемые эксперты!
Подскажите пожалуйста как решить проблему в 7 версии такого рода:
Эта версия позваляет использовать jpg файлы в базах данных, но у меня не получается их использование в грид таблице, что бы одновременно видеть несколько изображений из файлов. Если использовать bmp или pcx все работает нормально.

Приложение:

Отправлен: 05.03.2006, 16:30
Вопрос задал: Barbarian (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, Barbarian!
Нужно в uses подключить модуль jpeg. Тогда jpeg будет доступен для работы.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 05.03.2006, 16:37
Оценка за ответ: 3
Комментарий оценки:
дело в том что я написал что не работает только в гриде, а по одной картинке открывается, естественно я в uses jpeg включил


Вопрос № 36.830
Доброго времени суток, уважаемые эксперты! Подскажите, пожалуйста, как с помощью возможностей Delphi можно узнать установлен ли пароль для документа Word. Спасибо за ответы.
Отправлен: 05.03.2006, 19:43
Вопрос задал: Mybestpostbox (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Leshiy2006
Здравствуйте, Mybestpostbox!Попробуйте с помощью класса TRegistry наличие в реестрее ключей
MS Office
Ответ отправил: Leshiy2006 (статус: 4-ый класс)
Отправлен: 05.03.2006, 22:14
Оценка за ответ: 2
Комментарий оценки:
Спасибо за ответ, но, честно говоря, TRegistry и Ole никак не увяжу.


Вопрос № 36.831
Здравствуйте господа, есть вопрос, а как можно сделать, что б при щелчке мыши в проводнике на файл исх. данных, открылась моя программа и загрузила данные из этого фала. На подобие если выбрать файл txt то открывается блокнот с этим файлом. Я пробовал ловить имя через параметры, работает, но пока в имени файла нет пробелов, а если там несколько пробелов, вообще мрак. Может можно как-нибудь проще это сделать? И что нужно сделать в реестре, чтоб ОС ассоциировала расширение файла с моей программой? Спасибо огромное.
Отправлен: 05.03.2006, 19:49
Вопрос задал: SuperMaxx (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, SuperMaxx!
Ассоциация файлов с приложением - очень популярный вопрос. Вот ссылки на эту тему:
http://www.delphi.int.ru/modules.php?name=questions&action=view&id=189
http://www.delphi.int.ru/modules.php?name=questions&action=view&id=99
Думаю, этой информации будет достаточно для написания кода для ассоциации какого-то типа файлов с приложением.
И вот ещё модуль, обладающий этой функцией:
http://www.delphi.int.ru/download.php?id=101
По поводу пробелов - весь путь нужно заключать в кавычки, тогда он будет восприниматься полностью, т.е. правильно. Это одно из ключевых правил Windows.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Отправлен: 05.03.2006, 21:31
Оценка за ответ: 5
Комментарий оценки:
Спасибо.

Отвечает: Полховский Александр Владимирович
Здравствуйте, SuperMaxx!
Надо в строке параметров (это пишется в панель управления->Свойства папки->Типы файлов, там создайте/измените тип файла с нужным расширением, создайте действие Open/Открыть/Обработать или ещё какое-нибудь (, сделайте его используемым по умолчанию, если надо, тогда файл будет открываться вашей программой при 2х щелчке), там будет приложение и параметры к нему) надо написать "%1", а не %1, тогда передаваться будет весь параметр с пробелами, а не первая часть до пробела.
Вот так:
"C:Program filesMy programProject1.exe" "%1"

Если это делать через реестр, то надо найти/создать ключ с именем нужного расширения в ветках
HKEY_LOCAL_MACHINESOFTWAREClasses
HKEY_CLASSES_ROOT
например
HKEY_LOCAL_MACHINESOFTWAREClasses.txt
HKEY_CLASSES_ROOT.txt
изменить в нём значение Default на какое-нибудь уникальное (ну blabla можно),
затем в ветках HKEY_CLASSES_ROOT и HKEY_LOCAL_MACHINESOFTWAREClasses создать ключ с именем blabla, а в нём ещё 2: DefaultIcon, в значении которого будет путь к значку этого типа файлов, и Shell, в котором создаём ещё один дочерний ключ command, в котором создаются ключи с названиями действий, а вних в значениях Default находится командная строка для данного действия, например "C:Program filesMy programProject1.exe" "%1".

Несколько запутанно, но легко можете сами посмотреть в реестре по поиску ключа .txt, txtfile или просмотрев ключи HKEY_LOCAL_MACHINESOFTWAREClasses и HKEY_CLASSES_ROOT на примере .txt.
Удачи.
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Студент)
Отправлен: 06.03.2006, 01:03
Оценка за ответ: 5
Комментарий оценки:
Спасибо!!!

Отвечает: Alex_Nick
Здравствуйте, SuperMaxx!

В реестр надо добавить:
HKEY_CLASSES_ROOT.ext;
HKEY_CLASSES_ROOT.extshell;
HKEY_CLASSES_ROOT.extshellopen;
HKEY_CLASSES_ROOT.extshellopencommand;
и присвоить ему значение полного пути к exeшнику программы.
.ext - это расширение, которое нужно.
Ответ отправил: Alex_Nick (статус: 1-ый класс)
Отправлен: 06.03.2006, 21:18
Оценка за ответ: 5


Вопрос № 36.832
Здравствуйте, уважаемые эксперты.
Давно меня мучает 2 вопроса (возможно, взаимосвязаных):
1. Почему при перетаскивании окна все процедуры прерываются. пока окно не отпустишь, и как этого избежать ?
2. Что такое "потоки" (если это то, что позволяет запускать несколько процедур одноверменно), и какова сущность использования ? А то мне, честно говоря, начинает надоедать лепить по 3-4 таймера для некоторого анимирования для отображения процессов.

Всем откликнувшимся большое спасибо.
Отправлен: 05.03.2006, 19:49
Вопрос задал: Полховский Александр Владимирович (статус: Студент)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 6)

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

Потоки (они же нити) - это объекты, получающие время процессора. Время процессора выделяется квантами. Квант времени — это интервал, имеющийся в распоряжении потока до тех пор. пока время не будет передано в распоряжение другого потока.

Потоки как правило применяют для решения таких задач:
1. реализация длительных вычислений с сохранением реакции на ввод;
2. одновременная обработка ввода в несколько окон;
3. асинхронный ввод-вывод (как правило - при работе с портами COM).

В Delphi существует класс TThread, реализующий работу потока.

Поток имеет смысл, если выполняет какие-то действия. Они задаются в методе
procedure Execute; virtual; abstract;
потока.

Если в потоке будет выполняться какой-то цикл, в частности - анимация, и поток должен завершиться вместе с приложением, то условия окончания цикла должны быть примерно такими:

procedure TMyThread.Execute;
begin
repeat
DoSomething;
Until CancelCondition or Terminated;
end;
Здесь CancelCondition — ваше личное условие завершения потока (исчерпание данных, окончание вычислений, поступление на вход того или иного символа и т. п.), а свойство Terminated сообщает о завершении потока (это свойство может быть установлено как изнутри потока, так и извне; скорее всего, завершается породивший его процесс).

Конструктор потока
constructor Create(CreateSuspended: Boolean);
получает параметр CreateSuspended. Если его значение равно True, вновь созданный поток не начинает выполняться до тех пор, пока не будет сделан вызов метода Resume. В случае, если параметр CreateSuspended имеет значение False, конструктор завершается и только затем поток начинает исполнение.

Потоки создаются в отдельных модулях. Проще всего - File->New->Other->Thread Object. В этом случае создается шаблон будущего потока.

В заключение, привожу пример поточной анимации. На главной форме Edit и button. При нажатии на кнопку создается новый поток, рисующий квадрат "переменного цвета" на поверхности формы. Координата левого края квадрата задается в edit'e. unit1 - главная форма; unit2 - класс потока.
исходный код в приложении.

Приложение:

Ответ отправил: Alex_Nick (статус: 1-ый класс)
Отправлен: 05.03.2006, 23:12
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Довольно понятно и подробно. Всё равно ещё не подностью всё понимаю (ни разу не пользовался), но на примере надеюсь научусь. За пример, кстати, отдельно благодарю.

Отвечает: sir henry
Здравствуйте, Полховский Александр Владимирович!
1. Дело в том, что Ваша программа работает в одном единственном потоке, если только Ваши процедуры не распределены по разным потокам. То, что все связаное с окном замирает при его перетаскивании - свойство окна. Просто оно ждет, когда с ним закончится это действие. Перетаскивание имеет более высокий приоритет, потому-что это часть системы, а приоритет системы всегда выше приоритета любой Вашей программы.
Если хотите, чтобы Ваши процедуры не замирали при перетаскивании окна, то сделайте так, чтобы они не были связаны с окном, т.е. в простейшем случае создайте для них отдельные потоки или просто один отдельный поток для процедур, если они не сильно долго выполняются.
2. Про потоки Вам уже рассказал предыдущий эксперт.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 06.03.2006, 06:24
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Буду знать.

Отвечает: komatoz
Здравствуйте, Полховский Александр Владимирович!
Если хотите чтобы Ваш цикл не подвисал всю систему или программу, то для него используйте потоки:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyThread = class(TThread)
procedure Execute; override;
private
public
end;
var
Form1: TForm1;

Thread:TMyThread;
implementation

{$R *.dfm}

Procedure TMyThread.Execute;
var
i:integer;
c,d:string;
begin
for i:=1 to 10 do
begin
c:='Fuck';
Form1.Label1.Caption:=c;
Sleep(300);
d:='Offffffffffffffff';
Form1.Label1.Caption:=d;
Sleep(300); //sleep - всегда подвисает программу, в данном случае - нет
end;
Self.Terminate;//так выполнение потока можно завершить.
Exit;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Thread:= TMyThread.Create(False);//False - запускать потоки сразу после их создания
Thread.FreeOnTerminate := True;//ликвидировать потоки после их завершения
end;
end.
Ответ отправил: komatoz (статус: 2-ой класс)
Отправлен: 07.03.2006, 01:51
Оценка за ответ: 5
Комментарий оценки:
Отличный пример. Большое спасибо.


Вопрос № 36.847
Здраствуйте. Вопрос такой:
Есть таблица (StringGrid), у каждого столбца есть имя(Задаётся в нулевой строке), это имя изменяется в зависимости от языка, при выборе ячейки на её месте должна показывается Edit, DateTimePicker, ComboBox, ну и т.д., в зависимости от имени столбца. Столбцы можно премещать. Как это реализовать?
Спасибо.
Отправлен: 05.03.2006, 23:32
Вопрос задал: Yarking (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Alex_Nick
Здравствуйте, Yarking!

А как реализованы языки?

Допустим, это некие списки констант, формируемые заранее:
const Const_Date='Дата';

.....

На форму помещаем Stringgrid и невидимый datetimepicker. Для Stringgridа пишем обработчик активизации ячейки:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if arow>0 then begin //не строка-заголовок
if stringgrid1.Cells[acol,0]=Const_Date then //выбран столбец даты
begin
datetimepicker1.Show;
datetimepicker1.left:=stringgrid1.CellRect(acol,arow).Left+stringgrid1.Left;
datetimepicker1.top:=stringgrid1.CellRect(acol,arow).top+stringgrid1.top;
datetimepicker1.Width:=stringgrid1.ColWidths[acol]+4;
datetimepicker1.height:=stringgrid1.rowheights[arow]+4;
try
datetimepicker1.Date:=StrToDate(stringgrid1.Cells[acol,arow]);
except end;
row:=arow;col:=acol;
datetimepicker1.SetFocus;
end;

end;
end;

//Заполнение шапки таблицы
procedure TForm1.FormCreate(Sender: TObject);
begin
stringgrid1.Cells[1,0]:=Const_Date;
end;

//после правки ячейки снова прячем DateTimePicker.
procedure TForm1.DateTimePicker1Exit(Sender: TObject);
begin
stringgrid1.Cells[col,row]:=datetostr(datetimepicker1.Date);
datetimepicker1.Hide;
end;
Ответ отправил: Alex_Nick (статус: 1-ый класс)
Отправлен: 06.03.2006, 00:20
Оценка за ответ: 3


Вопрос № 36.854
Добрый день.
Можете подсказать, как сделать чтобы форма прокручивалась скролером. Т. е. есть форма. Появляеться вертикальный скролер, содиржимое окна увеличивает. Но при этом не реагирует на скролер мыши. Как это можно исправить.
Отправлен: 06.03.2006, 06:08
Вопрос задал: AllexZ (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Полховский Александр Владимирович
Здравствуйте, AllexZ!
Необходимо написать обработчики событий OnMouseWheelUp и OnMouseWheelDown для формы примерно так:
form1.VertScrollBar.Position:=form1.VertScrollBar.Position-20;
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Студент)
Отправлен: 06.03.2006, 07:02
Оценка за ответ: 5
Комментарий оценки:
А как написать оброботчик событий?
Может есть примеры?

Отвечает: Alex_Nick
Здравствуйте, AllexZ!

пишется обработчик события onMouseWheel для формы, приблизительно такого содержания:

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
form1.VertScrollBar.Position:=form1.VertScrollBar.Position-wheeldelta div 10;
end;

div 10 написал потому, что если меньше, то слишком резко скроллит.
Ответ отправил: Alex_Nick (статус: 1-ый класс)
Отправлен: 06.03.2006, 16:44
Оценка за ответ: 5
Комментарий оценки:
Как написать обрабочик событий, или это стандартный?


Вопрос № 36.876
Доброго времени суток, уважаемые эксперты! Подскажите как посредствами делфи (7) наложить водяной знак на изображение (gif, jpg,png и т.п.) Может кто знает где можно компонент найти выпоняющий такую функцию!

Спасибо.
Отправлен: 06.03.2006, 13:27
Вопрос задал: LeVin (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгения
Здравствуйте, LeVin!
Poprobujte vot eto:
http://offline.burik.ru/delphi/dw/mix_two_images.html
Esli ne podoidet, to izvinite.
Ответ отправила: Евгения (статус: 2-ой класс)
Отправлен: 06.03.2006, 21:00
Оценка за ответ: 4
Комментарий оценки:
Спасибо! Про эту процедуру я знаю... Но она работает насколько я понимаю только с bmp. А мне нужна поддержка хотя-бы самых распрастранненых форматов.


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.18 от 09.03.2006
Яндекс Rambler's Top100

В избранное