Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Обновлён FAQ для скачивания, Версия 2.0 (Более 1700 статей) 
:(
    Опции темы
Vit
Дата 4.2.2004, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Подумаю,может и правда сделаю в виде нескольких вариантов


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Cheba
Дата 5.2.2004, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



И можно сделать, чтобы если несколько частей в одной папке, то к любой можно было добраться из любого файла. Точно знаю, что html-help'ы можно связывать.
PM MAIL ICQ   Вверх
Medved
Дата 5.2.2004, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Кстати Вит, размер FAQ это действительно проблема. ПО крайней мере для USSR-ного пользователя, учитывая что большинство сидит на dual-up. Может как нибудь попробовать его оптимизировать. Или сжать чем нибуть сам exe-шник.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Monty
Дата 5.2.2004, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


Профиль
Группа: Участник Клуба
Сообщений: 3511
Регистрация: 3.4.2003
Где: Гваделупа

Репутация: нет
Всего: 27



Цитата
В DPR файле совершенно обычного проэкта дельфи можно указать функцию (процедуру) и объявить ее как экспортируемую - синтаксис точно такой-же как при создании стандартной DLL. С таким довеском EXE совершенно нормально компиллируется и работает и как EXE и как DLL (т.е. из нее можно импортировать описанные функции). Зачем это нужно? Была одна задача - делал консоль которая связывала воедино несколько приложений, так экспортные функции позволяли существенно расширять функциональность комплекса. Правда такой EXE все же имеет недостаток - EXE упаковщики сохраняют исполняемую часть и неправильно упаковывают экспортированную...

Поправка:
Протектор Armadillo этого минуса не имеет smile.gif ..... так что я им и ЕХЕ файлы содержащие экспортируемые функции протектирую/пакую и все работает smile.gif


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
Paradox
Дата 6.2.2004, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Vit не знаю видел или нет, и включены ли описанные здесь вопросы в наш FAQ, но будет время зайди глянь, я бы мог повыбирать но к сожалению не настолько хорошо знаком с содержанием нашего FAQ, так как заглядываю только по необходимости
ИМХО вышеописанные примеры могут быть отттуда, поэтому может там есть еще что-нибудь чего нет у нас


--------------------
---
PM MAIL WWW   Вверх
StayAtHome
Дата 8.2.2004, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Ну что ж... Продолжим! smile.gif
Smart Browse For Folder
example of smart usage of BrowseForFolder API function
including
- repositioning and resizing browse window
- adding a listbox, static elements and a button
- catching button click
- filling the listbox with file names
- custom information field
- custom condition for allowing folder selection
- creating new folder
- !!! REFRESHING TREE !!! after folder creation
(thanks to Leonid Kunin for his idea published at
http://codeguru.earthweb.com)

Copyright © Konstantin Polyakov, 2001

FIDO: 2:5030/542.251
e-mail: [email protected]
Web: http://kpolyakov.newmail.ru

Код

program SmartBff;

uses Windows, SysUtils, Messages,  ActiveX,  ShlObj,  CommCtrl,  Dialogs;

type AWndProc = function (Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):
                      LRESULT; stdcall;

const
   ID_CREATEBTN = 100;
   FileMask = '*.dat';

var MainWnd, TreeWnd, LBoxWnd, StatusWnd,
   DirLabel, CreateBtn: HWND;
   OldWndProc: AWndProc;
   PathSelected: string;

//-------------------------------------------------------------------
//       FILL LISTBOX
//-------------------------------------------------------------------
procedure FillListBox(LBoxWnd: HWND; Path, Mask: string);
var FindHandle: THandle;
   FindData: TWin32FindData;
begin
   SendMessage(LBoxWnd, LB_RESETCONTENT, 0, 0);
   if Path = '' then Exit;
   Path := Path + Mask;
   FindHandle := FindFirstFile(PChar(Path), FindData);
   while FindHandle <> INVALID_HANDLE_VALUE do begin
      if (FILE_ATTRIBUTE_DIRECTORY and FindData.dwFileAttributes) = 0 then
        with FindData do begin
           if (AnsiStrUpper(cFileName)=cFileName) and (cFileName[1]<>#0) then
             AnsiStrLower(cFileName+1);
           SendMessage(LBoxWnd, LB_ADDSTRING, 0, Longint(@cFileName[0]));
        end;
      if not FindNextFile(FindHandle, FindData) then begin
        Windows.FindClose(FindHandle);
        break;
      end;
   end;
end;

//-------------------------------------------------------------------
//       GET STATUS TEXT
//-------------------------------------------------------------------
function GetStatusText(var Enable: integer; Path: string): string;
begin
   Result := '';
   if Enable = 0 then begin
      Result := 'Ii?ii auae?aou eaoaeiae oieuei ia ?anoeeo aeneao';
      EnableWindow(CreateBtn, False);
      Exit;
   end;
   EnableWindow(CreateBtn, True);
   if SendMessage(LBoxWnd, LB_GETCOUNT, 0, 0) = 0 then begin
      Enable := 0;
      Result := 'A yoie iaiea iao io?iuo oaeeia.';
   end;
end;

//-------------------------------------------------------------------
//       DO CREATE FOLDER
//-------------------------------------------------------------------
function DoCreateFolder(Wnd: HWND; Folder: string): Boolean;
var i: integer;
   FullPath: string;
 procedure CreationError(Info: string);
 begin
    MessageBox(Wnd, PChar(Info), 'Ioeaea i?e nicaaiee iaiee', MB_ICONERROR or MB_OK);
 end;
begin
 Result := False;
 Folder := Trim(Folder);
 if (Length(Folder) = 0) or (Folder[1] = '.') then begin
    CreationError('Iaaa?iia eiy iaiee ' + Folder);
    Exit;
 end;
 for i:=1 to Length(Folder) do
    if (Folder[i] in ['<','>',':','/','\','|','*','?','"']) then begin
       CreationError('Eiy iaiee ia aie?ii niaap?aou neiaieia: \ / : * ? " < > |');
       Exit;
    end;
 if Length(PathSelected)=3 then
      FullPath := PathSelected + Folder
 else FullPath := PathSelected  + '\' + Folder;

 if not CreateDirectory(PChar(FullPath), nil) then begin
    CreationError('Ia oaaeinu nicaaou iaieo ' + FullPath);
    Exit;
 end;
 Result := True;
end;

//-------------------------------------------------------------------
//       BROWSE WND PROC



PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 8.2.2004, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Обработка сообщения о максимизации окна
Q: Я хочу обрабатывать сообщение об максимизации окна и изменить его размер вручную.
Я написал обработчик для SC_MAXIMIZE.
Но это мне дает ошибку duplicate virtual method error (?).
A: Вместо этого обрабатывайте сообщение WMGetMinMaxInfo.
Код

private
   procedure WMGetMinMaxInfo( var Message :TWMGetMinMaxInfo ); message WM_GETMINMAXINFO;

procedure TCCentre.WMGetMinMaxInfo( var Message :TWMGetMinMaxInfo );
begin
 with Message.MinMaxInfo^ do
 begin
   ptMaxSize.X := 640;              {Width when maximized}
   ptMaxSize.Y := 96;                {Height when maximized}
   ptMaxPosition.X := 0;            {Left position when maximized}
   ptMaxPosition.Y := 0;            {Top position when maximized}
   ptMinTrackSize.X := 500;      {Minimum width}
   ptMinTrackSize.Y := 96;        {Minimum height}
   ptMaxTrackSize.X := 640;     {Maximum width}
   ptMaxTrackSize.Y := 150;     {Maximum height}
 end;
 Message.Result := 0;                 {Tell windows you have changed minmaxinfo}
 inherited;
end;

-------------------------------------------------------------------------------

Как я могу вставить текст в TMemo в позиции курсора?
Я хочу использовать клавишу для вставки некоторых стандартных фраз.
Я решил эту проблему путем использования TEdit из которого я копирую текст
в clipboard и вставляю его в Memo. Это удовлетворительно,
но я не хочу использовать clipboard в своей программе,
к тому же пользователь может также вставить кое что свое, что нежелательно.

=== 1 ===
Используйте Windows API сообщение EM_REPLACESEL

EM_REPLACESEL
wParam = 0; /* not used, must be zero */
lParam = (LPARAM) (LPCSTR) lpszReplace; /* address of new string */

В программе пошлите сообщение EM_REPLACESEL для замены текущего выбора
текстом в параметре lpszReplace.

Параметр Описание
lpszReplace содержит замещающий текст
Возврат нет возвращаемого значения

Комментарий
Исползуйте EM_REPLACESEL когда вы хотите заменить тоько часть текста.
Если вы желаете заместить весь текст то используйте сообщение WM_SETTEXT.

Если выделение отсутствует то, замещаемый текст вставляется в текущую позицию.

=== 2 ===
для вставки строки в memo :
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
    with Memo1 do begin
     SelStart:=10;
     SelLength:=0;
     SelText:='This is a string inserted into a memo, at 10th char position ';
  end;
end;

для вставки и замены:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
    with Memo1 do begin
     SelStart:=10;
     SelLength:=20;
     SelText:='This is a string inserted, at 10th char position replacing 20 chars ';
  end;
end;


-------------------------------------------------------------------------------
Как заставить курсор перемещаться только x-координате
В вашем обработчике OnMouseMove сделайте следующее:
Код
  if (y<>0) and (lockY) then begin
    GetMouseCoords(NewX,NewY);
    NewY := NewY + y;                           {or should that be minus?}
    SetMouseCoords(NewX,NewY);
  end;

Переменная lockY определяет желаете ли вы подобное поведение курсора или нет.

PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 8.2.2004, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Я хочу узнать номер текущей записи для DBase таблицы.

Если набор данных является таблицей Paradox или dBASE то номер записи
может быть получен путем ряда вызовов BDE API.
BDE не поддерживает нумерацию для SQL таблиц,
но если ваш сервер поддерживает это, то вы должны ознакомиться
с соотвествующей документацией на сервер.

Следующая функция получает параметр любого компонента наследника от TDataset
(например TTable, TQuery, TStoredProc) и возвращвет номер текущей записи
(больше чем 0) если это таблица Paradox или dBASE. В других случая возвращается 0.

Примечние: для dBASE это номер физической записи.

Код
uses
 DbiProcs, DbiTypes, DBConsts;
function RecordNumber(Dataset: TDataset): Longint;
var
 CursorProps: CurProps;
 RecordProps: RECProps;
begin
 { Return 0 if dataset is not Paradox or dBASE }
 Result := 0;
 with Dataset do  begin
   { Is the dataset active? }
   if State = dsInactive then DBError(SDataSetClosed);
   { We need to make this call to grab the cursor's iSeqNums }
   Check(DbiGetCursorProps(Handle, CursorProps));
   { Synchronize the BDE cursor with the Dataset's cursor }
   UpdateCursorPos;
   { Fill RecordProps with the current record's properties }
   Check(DbiGetRecord(Handle, dbiNOLOCK, nil, @RecordProps));
   { What kind of dataset are we looking at? }
   case CursorProps.iSeqNums of
     0: Result := RecordProps.iPhyRecNum;  { dBASE   }
     1: Result := RecordProps.iSeqNum;     { Paradox }
   end;
 end;
end;


PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 8.2.2004, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Как я могу назначить заголовок для диспетчера печати?
Код
Printer.Title := 'Your Title Here';

-------------------------------------------------------------------------------

Существует ли способ вызвать метод Hint напрямую?
Я хочу по нажатию на определенную клавишу показать Hint для другого компонента
после 1 секунды или более и пропасть после отпускания клавиши.
Код
function RevealHint (Control: TControl): THintWindow;
{Показать окно Hint для указанного Control, и убрать его в методе RemoveHint.}
var
  ShortHint: string;
  AShortHint: array[0..255] of Char;
  HintPos: TPoint;
  HintBox: TRect;
begin
  Result := THintWindow.Create(Control);       { создать oокно для Hint }
  ShortHint := GetShortHint(Control.Hint);     { получить левую часть - до знака '|': }
  HintPos := Control.ClientOrigin;
  Inc(HintPos.Y, Control.Height + 6);    <<<< See note below
  HintBox := Bounds(0, 0, Screen.Width, 0);
  DrawText(Result.Canvas.Handle,
      StrPCopy(AShortHint, ShortHint), -1, HintBox,
      DT_CALCRECT or DT_LEFT or DT_WORDBREAK or DT_NOPREFIX);
  OffsetRect(HintBox, HintPos.X, HintPos.Y);
  Inc(HintBox.Right, 6);
  Inc(HintBox.Bottom, 2);
  { Now show the window: }
  Result.ActivateHint(HintBox, ShortHint);
end; {RevealHint}

procedure RemoveHint (var Hint: THintWindow);
{Убрать окно Hint ранее открытое в функции RevealHint.}
begin
  Hint.ReleaseHandle;
  Hint.Free;
  Hint := nil;
end; {RemoveHint}

-------------------------------------------------------------------------------
Есть ли какой либо метод вызываемый при переходе на другую строку в TDBGrid?

Вы можете использовать метод OnDataChange компонента Datasource
к которому подсоединен DBGrid. Если свойство State равно dsBrowse
то это означает переход на другую строки (или открытие таблицы).

Почему нет этого события у самого dbGrid? Потому что grid не единственный
компонент в который используется для показа данных из таблицы.
Использование Datasource обеспечивает централизованное управление данным событием.
-------------------------------------------------------------------------------
Как можно определить в обработчике MenuItem для PopupMenu,
на какой компоненте было произведено нажатие правой кнопки мыши?

Для этого нужно воспользоваться свойством PopupMenu.PopupComponent, например:
Код
procedure TForm1.PopupItem1Click(Sender: TObject);
begin
 Label1.Caption := PopupMenu1.PopupComponent.ClassName;
end;


PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 8.2.2004, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Почему экземпляры наследников TFiled, после вставки их через FieldEditor,
присутствуют в Object Inspector и в описании формы в PAS-файле,
но их иконки отсутствуют в форме (design-time)?

Дело в том, что наследники TFiled, такие как TStringField, TIntegerField и т.д.
зарегистрированы не процедурой RegisterComponents, а процедурой RegisterNoIcon.
Поэтому, хотя TField является наследником TComponent,
его наследники не имеют иконок в форме в режиме дизайна.
Вы можете использовать эту процедуру регистрации, если Вы хотите,
чтобы Ваши компоненты не отображались в палитре компонент Delphi,
но были доступны для вставки в форму и удаления из нее в режиме дизайна
из редакторов свойств (Property Editor) или редакторов компонент
(Component Editor) других компонент, присутствующих в форме.
Именно так сделан редактор компонент TTable и TQuery - Fields Editor.
-------------------------------------------------------------------------------
В BP 7.0 возможно было регулировать форму отображения величин
в процессе отладки в окне ""Watch List"". Возможно ли такое в Delphi?

Такой эффект можно достичь используя следующие спецификации формата отображения
(практически совпадающие с BP 7.0), которые указываются через запятую после
идентификатора инспектируемой величины:
Код

Символ   Применяется к типу Функциональность
-------- ------------------------------------------------------------------
H или X  Integers           Отображает целые величины в 16-ричном формате
                           с префиксом 0x

C        Char,strings       Показывает специальные символы (ASCII 0..31).
                           По умолчанию они отображаются в виде
                           esc-последовательности (/n , /t , и т.п.)

D        Integers           Отображает целые величины в десятичном формате.

Fn       Floating point     Показывает n десятичных знаков
                           (где n = 2..18, по умолчанию 7 )

nM       All                Дамп памяти, где n задает количество отображаемых
                           байт памяти, начиная с адреса величины.
                           По умолчанию каждый байт представляется двумя
                           16-ричными цифрами, но возможно также совместное
                           использование nM с другими форматами.

P        Pointers           Отображает величину, как указатель в формате seg:ofs.

R        Records, classes,  Показывает не только величины полей,
        objects            но и сами поля, напрмер, как (X:2; Y:5)
                           вместо (2, 5).

S        Char,strings       Показывает любые неотображаемые ASCII символы в виде #nn.
                           Используется вместе с nM.


PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 8.2.2004, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Как определить, что текущая запись удаленная или нет
Аналог функции dBase DELETED()
Код
function Deleted(Table:TTable);
var
 Prop : RECProps;
begin
 dbiGetRecord(Table.Handle, dbiNoLock, nil, @Prop);
 Result := Prop.bDeleteFlag;
End;

Аналог функции dBase SET DELETED ON/OFF
Код
procedure ShowDeleted(Table: TTable; ShowFlag: Boolean;);
begin
 if ShowFlag then
   dbiSetProp(hDBIObj(Table.Handle), curSOFTDELETEON, 1)
 else
  dbiSetProp(hDBIObj(Table.Handle), curSOFTDELETEON, 0);
end;

-------------------------------------------------------------------------------
Как востановить удаленые записи ддля dBase таблиц?
Востановление удаленной записи. Аналог функции dBase RECALL
После востановления требуется вызов метода Table.Refresh
Код
Function UnDelete(Table:TTable) : INTEGER;
begin
 if Table.State = dsBrowse then
   Table.Edit;               { востановление в режиме EDIT }
   Result := DbiUndeleteRecord(Table.Handle);               { код ошибки }
   Table.State := dsBrowse;  { после востновления всегда в режим BROWSE }
end;

-------------------------------------------------------------------------------
Как получить номер физической записи для dBase таблиц
Получение номера физической записи. Аналог функции dBase RECNO()
Код
function RecNo(Table:TTable);
var
 Prop : RECProps;
begin
 if Table.State = dsBrowse THEN BEGIN
   Table.UpdateCursorPos;
   dbiGetRecord(Table.Handle, dbiNoLock, NIL, @Prop);  {get record number}
   Result := Prop.iPhyRecNum;
 end;
end;[code]
-------------------------------------------------------------------------------
[b]Как запретить кнопку Close [x] в заголовке окна.[/b]
[b]Способ 1[/b]
[code]procedure TForm1.FormCreate(Sender: TObject);
var
 Style: Longint;
begin
 Style := GetWindowLong(Handle, GWL_STYLE);
 SetWindowLong(Handle, GWL_STYLE, Style And Not WS_SYSMENU);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if (Key = VK_F4) and (ssAlt in Shift) then begin
   MessageBeep(0);
   Key := 0;
 end;
end;

Автор:Alexander Petrushev
(2:5001/88.10)
Способ 2
На самом деле есть более простой способ (запрет на SC_CLOSE),
но я уже деталей его не помню.
Автор:Akzhan Abdulin
(2:5040/55)
Способ 3
Код
{ Disable close button }
procedure TForm1.Button1Click(Sender: TObject);
var
 SysMenu: HMenu;
begin
 SysMenu := GetSystemMenu(Handle, False);
 Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED or MF_GRAYED);
end;
{ Enable close button }
procedure TForm1.Button2Click(Sender: TObject);
begin
 GetSystemMenu(Handle, True);
 Perform(WM_NCPAINT, Handle, 0);
end;

-------------------------------------------------------------------------------
Как убрать всплывающие подсказки в TreeView?
TCustomTreeView.WMNotify. О том, что такое тип notify'а TTM_NEEDTEXT пpочтешь в хелпе. Убpать хинты можно, пеpекpыв обpаботчик для этого уведомительного сообщения.
Автор:Eugene Mayevski
[email protected]
(2:463/209.209)

PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 10.2.2004, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Замеченные недочеты]
- В разделе "Системные функции и WinAPI/Windows/Звук/Как можно получить звук с микрофона" есть тема "Пример работы с DrawIcon(Ex)"
- Частичный дубляж:
Цитата
Системные функции и WinAPI/Windows/Звук/Как можно получить звук с микрофона/Как сделать регулятор громкости?
и
Цитата
Работа с графикой и мультимедиа/Работа со звуком/Изменить громкость

--------------------------------------------------------------------------------
Как сделать пункт " по умолчанию" в Pop-Up меню выделенным ?]
Устанавливается пункт " по умолчанию" в любом меню функцией
Код
API SetMenuDefaultItem(HMENU hMenu, UINT uItem, UINT fByPos)

подробности - в Win32 SDK документации. Пункт "По умолчанию" не влияет на работу меню - это чисто интерфейсное выделение пункта меню полужирным (bold) шрифтом.
--------------------------------------------------------------------------------

PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 10.2.2004, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Как поместить ProgressBar на StatusBar.
Есть два принципиально разных решения. Первый вариант - это сделать все " вручную" .
Здесь создается Bitmap с текстом (возможно любое изображение). Чтобы нарисовать светлую часть полосы, достаточно скопировать кусок Bitmap на StatusBar, а чтобы нарисовать темную часть полосы, нужно скопировать кусок Bitmap с инвертированием. При этом фон станет темным, а текст светлым. Реализация ясна из самой программы.
Второй вариант более простой в реализации, но и менее функциональный. StatusBar является наследником TWinControl, а следовательно, на нем можно разместить еще какие-то компоненты. Но сделать это можно только динамически (непосредственно из программы). На StatusBar помещается компонент ProgressBar, вначале невидимый. Когда в нем появляется необходимость, его нужно сделать видимым и начать изменять свойство Position.
Из этого примера хорошо видны некоторые достоинства и недостатки объектов.
Если у Вас Delphi3, то строчка pb.Smooth := true; работать не будет. На сайте выложена версия программы с заменой этой строчки. Впрочем, ее можно просто удалить - принципиально это ничего не изменит. Скачать все необходимые для компиляции файлы проекта можно на program.dax.ru.
Способ 1
Код
uses Commctrl;
const
 MaxProgress = 50;
var
 bm: TBitmap;
// Возвращает прямоугольник нулевой панели:
function GetPanelRect: TRect;
begin
 SendMessage(Form1.StatusBar1.Handle, SB_GETRECT, 0,
   integer(@result));
 InflateRect(result, -1, -1);
end;

// Копирует часть bm на StatusBar
procedure CopyPart(left, right: integer; ACopyMode: TCopyMode);
var bmRect, pnRect: TRect;
begin
 bmRect := Rect(left, 0, right, bm.Height - 1);
 pnRect := bmRect;
 with GetPanelRect do
   OffsetRect(pnRect, Left, Top);
 with Form1.StatusBar1.Canvas do begin
   CopyMode := ACopyMode;
   CopyRect(pnRect, bm.Canvas, bmRect);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 with StatusBar1.Panels.Add do begin
   Width := 100;
   Style := psOwnerDraw;
 end;
 with StatusBar1.Panels.Add do begin
   Width := 0;
   Text := 'abc';
 end;
 Timer1.Enabled := false;
 Timer1.Interval := 50;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled := true;
 bm := TBitmap.Create;
 with GetPanelRect do begin
   bm.Width := Right - Left;
   bm.Height := Bottom - Top;
 end;
 with bm.Canvas do begin
   Brush.Color := clSilver;
   FillRect(Bounds(0, 0, bm.Width, bm.Height));
   TextOut(1, 1, 'Doing smth...');
 end;
 CopyPart(0, bm.Width - 1, cmSrcCopy); // Вывод текста
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Timer1.Tag := Timer1.Tag + 1;
 if Timer1.Tag >  MaxProgress then begin
   Timer1.Enabled := false;
   Timer1.Tag := 0;
   StatusBar1.Repaint; // Очистка StatusBar
 end else
   // Вывод только что закрашенной части:
   CopyPart(trunc((Timer1.Tag - 1) / MaxProgress * bm.Width),
     trunc(Timer1.Tag / MaxProgress * bm.Width), cmNotSrcCopy);
end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
 Panel: TStatusPanel; const Rect: TRect);
var p: integer;
begin
 if (Panel.Index = 0) and (Timer1.Tag >  0) then begin
   p := round((Rect.Right - Rect.Left) * Timer1.Tag / MaxProgress);
   // Вывод закрашенной части:
   CopyPart(0, p, cmNotSrcCopy);
   // Вывод незакрашенной части:
   CopyPart(p + 1, bm.Width - 1, cmSrcCopy);
 end;
end;

--------------------
Способ 2
Код
uses Commctrl;
const
 MaxProgress = 50;
var pb: TProgressBar;

function GetPanelRect: TRect;
begin
 SendMessage(Form1.StatusBar1.Handle, SB_GETRECT, 0, integer(@result));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 with StatusBar1.Panels.Add do begin
   Width := 100;
   Style := psOwnerDraw;
 end;
 with StatusBar1.Panels.Add do begin
   Width := 0;
   Text := 'abc';
 end;
 Timer1.Enabled := false;
 Timer1.Interval := 50;
 pb := TProgressBar.Create(StatusBar1);
 pb.Visible := false;
 pb.Parent := StatusBar1;
 pb.BoundsRect := GetPanelRect;
 pb.Smooth := true;
 pb.Step := 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled := true;
 pb.Position := 0;
 pb.Max := MaxProgress;
 pb.Visible := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Timer1.Tag := Timer1.Tag + 1;
 if Timer1.Tag >  MaxProgress then begin
   Timer1.Enabled := false;
   Timer1.Tag := 0;
   pb.Visible := false;
 end else pb.StepIt;
end;

Все советы и замечания, пожалуйста, присылайте на [email protected]
Даниил Карапетян.

Это сообщение отредактировал(а) StayAtHome - 10.2.2004, 02:10
PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 10.2.2004, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Алгоритм распо§нования кодировки нужен для автоматического декодирования текста.
Этот алгоритм основан на том, что некоторые буквы русского алфавита встречается очень часто, а некоторые редко. Поскольку этот способ статистический, то лучше всего он работает с большими текстами.
Код
type
 TCode = (win, koi, iso, dos);
const
 CodeStrings: array [TCode] of String = ('win','koi','iso','dos');
procedure TForm1.Button1Click(Sender: TObject);
var
 str: array [TCode] of string;
 norm: array ['А'..'я'] of single;
 code1, code2: TCode;
 min1, min2: TCode;
 count: array [char] of integer;
 d, min: single;
 s, so: string;
 chars: array [char] of char;
 c: char;
 i: integer;
begin
 so := Memo1.Text;

 norm['А'] := 0.001;
 norm['Б'] := 0;
 norm['В'] := 0.002;
 norm['Г'] := 0;
 norm['Д'] := 0.001;
 norm['Е'] := 0.001;
 norm['Ж'] := 0;
 norm['З'] := 0;
 norm['И'] := 0.001;
 norm['Й'] := 0;
 norm['К'] := 0.001;
 norm['Л'] := 0;
 norm['М'] := 0.001;
 norm['Н'] := 0.001;
 norm['О'] := 0.001;
 norm['П'] := 0.002;
 norm['Р'] := 0.002;
 norm['С'] := 0.001;
 norm['Т'] := 0.001;
 norm['У'] := 0;
 norm['Ф'] := 0;
 norm['Х'] := 0;
 norm['Ц'] := 0;
 norm['Ч'] := 0.001;
 norm['Ш'] := 0.001;
 norm['Щ'] := 0;
 norm['Ъ'] := 0;
 norm['Ы'] := 0;
 norm['Ь'] := 0;
 norm['Э'] := 0.001;
 norm['Ю'] := 0;
 norm['Я'] := 0;
 norm['а'] := 0.057;
 norm['б'] := 0.01;
 norm['в'] := 0.031;
 norm['г'] := 0.011;
 norm['д'] := 0.021;
 norm['е'] := 0.067;
 norm['ж'] := 0.007;
 norm['§'] := 0.013;
 norm['и'] := 0.052;
 norm['й'] := 0.011;
 norm['к'] := 0.023;
 norm['л'] := 0.03;
 norm['м'] := 0.024;
 norm['н'] := 0.043;
 norm['о'] := 0.075;
 norm['п'] := 0.026;
 norm['р'] := 0.038;
 norm['с'] := 0.034;
 norm['т'] := 0.046;
 norm['у'] := 0.016;
 norm['ф'] := 0.001;
 norm['х'] := 0.006;
 norm['ц'] := 0.002;
 norm['ч'] := 0.011;
 norm['ш'] := 0.004;
 norm['щ'] := 0.004;
 norm['ъ'] := 0;
 norm['ы'] := 0.012;
 norm['ь'] := 0.012;
 norm['э'] := 0.003;
 norm['ю'] := 0.005;
 norm['я'] := 0.015;

 Str[win] := 'АаБбВвГгДдЕеЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя';
 Str[koi] := 'юЮаАбБцЦдДеЕфФгГхХиИйЙкКлЛмМнНоОпПяЯрРсСтТуУжЖвВьЬыЫзЗшШэЭщЩчЧъЪ';
 Str[iso] := 'РрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯяа№бёв?гѓдєеѕжізїијйљкњлћм?н§оўпџ';
 Str[dos] := 'Ђ ?Ў‚ўѓЈ„¤…Ґ†¦‡§?Ё‰©ЉЄ‹Њ¬?­Ћ®?Ї?а‘б’в“г”д•е–ж—з'
 for c := #0 to #255 do
   Chars[c] := c;

 min1 := win;
 min2 := win;
 min := 0;
 s := so;
 fillchar(count, sizeof(count), 0);
 for i := 1 to Length(s) do
   inc(count[s[i]]);
 for c := 'А' to 'я' do
   min := min + sqr(count[c] / Length(s) - norm[c]);
 for code1 := low(TCode) to high(TCode) do begin
   for code2 := low(TCode) to high(TCode) do begin
     if code1 = code2 then continue;

     s := so;
     for i := 1 to Length(Str[win]) do
       Chars[Str[code2][i]] := Str[code1][i];
     for i := 1 to Length(s) do
       s[i] := Chars[s[i]];
     fillchar(count, sizeof(count), 0);
     for i := 1 to Length(s) do
       inc(count[s[i]]);
     d := 0;
     for c := 'А' to 'я' do
       d := d + sqr(count[c] / Length(s) - norm[c]);
     if d <  min then begin
       min1 := code1;
       min2 := code2;
       min := d;
     end;
   end;
 end;

 s := Memo1.Text;
 if min1 < >  min2 then begin
   for c := #0 to #255 do
     Chars[c] := c;
   for i := 1 to Length(Str[win]) do
     Chars[Str[min2][i]] := Str[min1][i];
   for i := 1 to Length(s) do
     s[i] := Chars[s[i]];
 end;
 Form1.Caption := CodeStrings[min2] + ' ' + CodeStrings[min1];

 Memo2.Text := s;
end;


PM MAIL WWW ICQ YIM   Вверх
Cashey
Дата 14.2.2004, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Я что-то не понял у нас теперь FAQ в виде постов оформляется?


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0961 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.