Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 4

Автор: delover
Дата сообщения: 28.10.2008 11:10
Frodo_Torbins

Цитата:
Там архив всего 80Кб.

Всего? Ну-ну... Хотя всё одно придётся когда-нибудь осваивать.
А Вы не подскажете как лучше понимать utc? Мне было бы удобнее тупо, т.е. что написано, то и есть. Но может быть это не правильно? Функции смотрел, но пока от себя не добавлял.
Автор: Jokerjar79
Дата сообщения: 28.10.2008 14:56
Maks150988, если у тебя имеется какой-либо многострочный текст, к примеру, в переменной txt, то через тот же StringList можно сделать так

Код: var
List: TStringList;

begin
List := TStringList.Create;
List.Text := txt;
// Доступ к строкам как к элементам массива: List.Strings[0], List.Strings[1], ...
List.Free;
end.
Автор: Frodo_Torbins
Дата сообщения: 28.10.2008 15:45
delover

Цитата:
Всего? Ну-ну...
- там хелп довольно объемный полюс демки.

Цитата:
utc
- с этим к сожалению не знаком.
Автор: delover
Дата сообщения: 28.10.2008 16:11
Frodo_Torbins
А готовые к использованию приложения можно посмотреть? Где и как это использовано.
Автор: Maks150988
Дата сообщения: 28.10.2008 20:12
Jokerjar79
Мне б еще без VCL мусора просто. СтрингЛист я смотрю активно использует SysUtils, а вырезать код задолбаешься для стринглиста...
ShIvADeSt
Чего-то нифига не работает... Крутил и так и сяк, даже пытался индекс выводить - а то просто пустой массив был я хотел узнать индекс хоть увеличивается или нет в цикле. Доигрался до того что система в синий экран выпала...
И RouteList вы наверное пиняли за строку, хотя на самом деле это массив строк.
Автор: Frodo_Torbins
Дата сообщения: 28.10.2008 20:27
delover
В SynEdit-е используется.
Maks150988
Тогда вырежте функцию TStrings.SetTextStr.
Автор: ShIvADeSt
Дата сообщения: 29.10.2008 02:01
Maks150988

Цитата:
Чего-то нифига не работает... Крутил и так и сяк, даже пытался индекс выводить - а то просто пустой массив был я хотел узнать индекс хоть увеличивается или нет в цикле. Доигрался до того что система в синий экран выпала...
И RouteList вы наверное пиняли за строку, хотя на самом деле это массив строк.

О блин, просто я читал вот это

Цитата:
Имеем например строку, которую скачали с сайта - это например полноценный текстовый файл. Так вот необходимо его распарсить и позагонять строчки в массив

поэтому естессно предположил, что RouteList - это именно та строка которую вы скачали. Для нее я и писал парсер. Если это массив - то нафига еще парсить? Уточни плиз
Автор: Maks150988
Дата сообщения: 29.10.2008 08:03
ShIvADeSt
Ну значит

Index : Integer; // Индекс числа строк в массиве.
RouteList : Array of String; // Массив строк с маршрутами
S : String; // Строка с данными с сервера

Необходимо распарсить S на нахождение #13#10...
// Потом через for Index := 1 to Index do начинаю запонять ListView строками из массива RouteList.


Добавлено:
ShIvADeSt
Ну значит

Index : Integer; // Индекс числа строк в массиве.
RouteList : Array of String; // Массив строк с маршрутами
S : String; // Строка с данными с сервера

Необходимо распарсить S на нахождение #13#10...
// Потом через for Index := 1 to Index do начинаю запонять ListView строками из массива RouteList.
Автор: ShIvADeSt
Дата сообщения: 29.10.2008 09:00
Maks150988

Цитата:

Index : Integer; // Индекс числа строк в массиве.
RouteList : Array of String; // Массив строк с маршрутами
S : String; // Строка с данными с сервера

в моем примере замени
i на Index
RouteList на S
а MyArray на RouteList
и получишь парсер
Автор: Maks150988
Дата сообщения: 29.10.2008 11:03
ShIvADeSt
Да я так и делал. Индекс был равен нулю после цикла и в список ничего не добавлялось...

Хм, сейчас сделал строку. s - строка с загруженными данными с сайта. sss - проверочная строка.


Код: sss := '172.16.0.0 mask 255.240.0.0 (ADSL)'+#13#10+
'10.0.0.0 mask 255.0.0.0 (Ethernet)'+#13#10+
'192.168.0.0 mask 255.255.255.0 (Wi-Fi)';

s := s + #13#10;
while Length(s) > 0 do
begin
if Pos(#13#10, s) > 1 then
begin
ResSt := Copy(s, 1, Pos(#13#10, s) - 1);
if not((ResSt = '')) then
begin
Inc(Index);
RouteList[Index] := PChar(ResSt);
end;
end;
Delete(s, 1, Pos(#13#10, s) + 1);
end;

messagebox(happ,pchar(RouteList[1]),nil,mb_ok);
messagebox(happ,pchar(RouteList[2]),nil,mb_ok);
messagebox(happ,pchar(RouteList[3]),nil,mb_ok);
messagebox(happ,pchar(inttostr(index)),nil,mb_ok);
Автор: ShIvADeSt
Дата сообщения: 29.10.2008 11:57
Maks150988

Цитата:

Ну тут ваша функция работает хорошо со строкой sss. Но я чего-то не пойму чего она не работает когда надо обработать строку с данными из загруженного файла с сайта... Все данные записываются только в первую строку в массива, а остальные пустые... Я не знаю но тогда что это за символ перехода на новую строку? Вогнал текст в эдит и там видно две квадратные скобки - типа этот символ так отображается.

Мой совет, в хекс кодах посмотри какие символы используются в том файле для перевода строки, так как у юникса они одни, у винды другие.
Автор: DmitryKz
Дата сообщения: 29.10.2008 12:30
Меня тут приятель озадачил вопросом и поскольку я не очень продвинут в дельфийских технологиях, не знал, что ему посоветовать:
он хочет распространять свою программу на дисках и через интернет. Ну с Интернетом все понятно. А по поводу дисков он хочет сгенерировать пару тысяч серийников, вложить их в коробки, а затем пользователи после установки и ввода этого серийника должны активировать через Интернет программу - в общем, так он хочет сделать минимальным вероятность установки программы больше чем на два компьютера. Вот он и спрашивает: есть ли компонент для этих двух целей: генерация большого кол-ва серийников и последующая проверка их через Инет???

А теперь мой вопрос:
как в приложениях MDI получают доступ к кантролам дочерних окон? Ну вот, скажем, есть дерево оглавления, по щелчку на нем открывается документ, это просто. А теперь пользователь щелкнет на подразделе дерева (символизирует подраздел документа), если документ уже открыт в дочерних, осуществляется переход в заданное его место - и вот тут мне непонятно. Пока я реализовал это через создание массива и хранение в нем всех дочерних окон (их ссылок, конечно) и использования свойства Tag. В-общем, все работает - по закрытии дочерних окон массив просто перестраивается. Но все равно тайная мысль не дает покоя - в профессиональных приложениях используется такой же метод? Или нет? Ведь через массив MDIChildren можно только достучаться до формы, но не до ее компонентов (получаю сообщение о несовместимости TfrmChildren и TForm).
Автор: Maks150988
Дата сообщения: 29.10.2008 12:48
ShIvADeSt
Спасибо. Я забыл что сервер юниксовый и файл создавался там. Переход на новую строку там #10 считается или sLineBreak в Delphi. Правда если sLineBreak указывать, то программа вылетает. Пришлось #10 указать и еще прибавить #10 в начало загруженной строки, а то первая строка неправильно немного парсилась.
Автор: Coltrain
Дата сообщения: 29.10.2008 12:57
DmitryKz

Цитата:
Ведь через массив MDIChildren можно только достучаться до формы, но не до ее компонентов (получаю сообщение о несовместимости TfrmChildren и TForm).

Дык, просто приводи MDIChildren[i] к нужному типу и получится доступ ко всем контролам. Ну типа так:
If MDIChildren[i] is TfrmChildren then (MDIChildren[i] as TfrmChildren).ИндивидуальноеСвойство := ЧемуНибудь
Автор: DmitryKz
Дата сообщения: 29.10.2008 14:04
Coltrain
Понял
Автор: delover
Дата сообщения: 29.10.2008 14:16
Maks150988
Ну вы как маленькие, Count #13 и Count #10. Если одинаково то не парсить.
Автор: Maks150988
Дата сообщения: 30.10.2008 23:36
delover
Ну теперь буду знать.

Хм, решил повозиться с кодом овнердрава трекбара. [more=Здесь]program trackbar;

uses
Windows,
Messages,
CommCtrl,
SysUtils;

const
szClassName = 'Trackbar_Ownerdraw';
WindowWidth = 185;
WindowHeight = 80;
IDC_TRACKBAR = 100;

function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall;
var
Value : Integer;
BrushNew : HBRUSH;
BrushOld : HBRUSH;
PenBrush : HPEN;
begin
Result := 0;
case uMsg of
WM_CREATE:
begin
CreateWindowEx(0, TRACKBAR_CLASS, '', TBS_HORZ or TBS_AUTOTICKS or WS_CHILD or WS_VISIBLE or WS_TABSTOP, 15, 15, 150, 20, hWnd, IDC_TRACKBAR, hInstance, nil);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETRANGE, Integer(TRUE), MAKELONG(0, 30));
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 5);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 10);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 15);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 20);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 25);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETPAGESIZE, 0, 1);
SetFocus(hWnd);
end;
WM_HSCROLL:
case LoWord(wParam) of
TB_PAGEUP, TB_LINEUP, TB_LINEDOWN, TB_PAGEDOWN, TB_TOP,
TB_BOTTOM, TB_ENDTRACK, TB_THUMBPOSITION, TB_THUMBTRACK:
begin
Value := SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_GETPOS, 0, 0);
Value := Value - 15;
SendMessage(hWnd, WM_SETTEXT, 0, Integer(PChar(IntToStr(Value))));
end;
end;
WM_NOTIFY :
begin
with PNMHdr(lParam)^ do

if PNMHdr(lParam).idFrom = IDC_TRACKBAR then
begin
case PNMHdr(lParam)^.code of

NM_CUSTOMDRAW :
begin
with PNMLVCUSTOMDRAW(lParam)^ do
begin
case nmcd.dwDrawStage of

CDDS_PREPAINT :
begin
Result := CDRF_NOTIFYITEMDRAW;
SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW or CDRF_NOTIFYPOSTPAINT);
end;

CDDS_ITEMPREPAINT :
begin
case nmcd.dwItemSpec of

TBCD_CHANNEL, TBCD_THUMB :
begin
BrushNew := CreateSolidBrush(RGB(200, 215, 240));
BrushOld := SelectObject(nmcd.hDC, BrushNew);
FillRect(nmcd.hDC, nmcd.rc, BrushNew);
PenBrush := CreatePen(PS_SOLID, 1, RGB(50, 105, 200));
SelectObject(nmcd.hDC, PenBrush);
Rectangle(nmcd.hDC, nmcd.rc.Left, nmcd.rc.Top, nmcd.rc.Right, nmcd.rc.Bottom);
DeleteObject(PenBrush);
SetBkColor(nmcd.hDC, RGB(200, 215, 240));
SelectObject(nmcd.hDC, BrushOld);
DeleteObject(BrushNew);
Result := CDRF_SKIPDEFAULT;
end;

TBCD_TICS :
begin
Result := CDRF_DODEFAULT;
end;

end;
Result := CDRF_SKIPDEFAULT;
end;

CDDS_ITEMPOSTPAINT :
begin
case nmcd.dwItemSpec of

TBCD_CHANNEL :
begin
Result := CDRF_SKIPDEFAULT;
end;

TBCD_TICS, TBCD_THUMB :
begin
Result := CDRF_DODEFAULT;
end;

end;
end;

CDDS_POSTPAINT :
begin
Result := CDRF_SKIPDEFAULT;
end;


else
Result := CDRF_DODEFAULT;
SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_DODEFAULT);
end; // case nmcd.dwDrawStage of
end; // with PNMLVCUSTOMDRAW(pnmh)^ do
end; // NM_CUSTOMDRAW:
end;
end;
end;

WM_DESTROY: PostQuitMessage(0);
else
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;
end;

var
WndClass: TWndClassEx = (
cbSize : SizeOf(TWndClassEx);
Style : CS_HREDRAW or CS_VREDRAW;
lpfnWndProc : @WndProc;
cbClsExtra : 0;
cbWndExtra : 0;
hbrBackground : COLOR_3DFACE+1;
lpszMenuName : nil;
lpszClassName : szClassName;
hIconSm : 0);
uMsg : TMsg;
hwndMain: Cardinal;
begin
InitCommonControls;
WndClass.hInstance := hInstance;
WndClass.hIcon := 0;
WndClass.hCursor := LoadCursor(0, IDC_ARROW);
RegisterClassEx(WndClass);
hwndMain := CreateWindowEx(0, szClassName, szClassName, WS_CAPTION or WS_VISIBLE or WS_SYSMENU, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), WindowWidth, WindowHeight, 0, 0, hInstance, nil);
while TRUE do
begin
if not GetMessage(uMsg, 0, 0, 0) then
Break;
if not IsDialogMessage(hWndMain, uMsg) then
begin
TranslateMessage(uMsg);
DispatchMessage(uMsg);
end;
end;
ExitCode := uMsg.wParam;
end.
[/more] недоделанный от незнания и непонимания код. Что странно , вот сейчас трекбар прорисовывается нормально, но это когда функция возвращает результат через LRESULT, а не BOOL. Сам оригинал на языке Си находится тут. Я если честно, разбирая и портируя код, не могу понять как возвратить конкретный результат для каждого элемента в CDDS_ITEMPOSTPAINT или CDDS_ITEMPREPAINT. Я конечно написал возвращаемый результат вконце рисования каждого элемента, но компилятор указывает что этот участок кода не будет выполнен, а посему я немного недогоняю - уж не профессионал я, а просто любитель. Да и немного непонятно как риски прорисовать у трекбара. Вроде делаю наподобие как в том примере...
Автор: ShIvADeSt
Дата сообщения: 31.10.2008 04:46
Maks150988

Цитата:
но это когда функция возвращает результат через LRESULT, а не BOOL

Почитай насчет WndProc при CreateWindow

Цитата:

The WindowProc function is an application-defined callback function that processes messages sent to a window.
LRESULT CALLBACK WindowProc(

так что все правильно, надо LRESULT юзать.
А вот DialogBox юзает другой вид функции

Цитата:

The DialogProc function is an application-defined callback function that processes messages sent to a modal or modeless dialog box.

BOOL CALLBACK DialogProc(

тут BOOL. Помню в свое время сам понять не мог, когда пытался портировать.
Посмотрел твой код, невнимательность, в одном месте сделал вот такую вещь

Код:
end;
Result := CDRF_SKIPDEFAULT;
end;

Автор: Maks150988
Дата сообщения: 31.10.2008 14:29
ShIvADeSt
Спасибо. А как вот тогда прорисовывать контрол, если необходимо через DialogBox грузить ресурс. Я просто результат возвращал как BOOL(CDRF_SKIPDEFAULT) например. С LRESULT тогда все понятно.
Исходный код стал [more=такой]program trackbar;

uses
Windows, Messages, CommCtrl;

const
szClassName = 'Trackbar_Ownerdraw';
WindowWidth = 185;
WindowHeight = 80;
IDC_TRACKBAR = 100;

var
OldWndProc : Pointer;

function IntToStr(I : Integer) : String;
begin
Str(I, Result);
end;

function NewWndProc(Trkb : HWND; uMsg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall;
begin
Result := 0;
case uMsg of
WM_MOUSELEAVE :
begin
end;
// WM_MOUSEMOVE :
// begin
// end;
else
Result := CallWindowProc(OldWndProc, Trkb, uMsg, wParam, lParam);
end;
end;

procedure PaintItemTrackbar(DC : HDC; RC : Trect; clrBr, clrPen : COLORREF);
var
BrushNew : HBRUSH;
BrushOld : HBRUSH;
PenBrush : HPEN;
begin
BrushNew := CreateSolidBrush(clrBr);
BrushOld := SelectObject(DC, BrushNew);
FillRect(DC, RC, BrushNew);
PenBrush := CreatePen(PS_SOLID, 1, clrPen);
SelectObject(DC, PenBrush);
Rectangle(DC, RC.Left, RC.Top, RC.Right, RC.Bottom);
DeleteObject(PenBrush);
SetBkColor(DC, clrBr);
SetBkMode(DC, TRANSPARENT);
SelectObject(DC, BrushOld);
DeleteObject(BrushNew);
end;

function MainWndProc(hWnd : HWND; uMsg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall;
var
Value : Integer;
begin
Result := 0;
case uMsg of

WM_CREATE :
begin
CreateWindowEx(0, TRACKBAR_CLASS, '', TBS_HORZ or WS_CHILD or WS_VISIBLE or WS_TABSTOP or WS_CLIPCHILDREN, 15, 15, 150, 20, hWnd, IDC_TRACKBAR, hInstance, nil);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETRANGE, Integer(TRUE), MAKELONG(0, 30));
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETPAGESIZE, 0, 5);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 5);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 10);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 15);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 20);
SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_SETTIC, 0, 25);
OldWndProc := Pointer(SetWindowLong(GetDlgItem(hWnd, IDC_TRACKBAR), GWL_WNDPROC, LongInt(@NewWndProc)));
end;

WM_HSCROLL :
case LoWord(wParam) of
TB_PAGEUP, TB_LINEUP, TB_LINEDOWN, TB_PAGEDOWN, TB_TOP, TB_BOTTOM, TB_ENDTRACK, TB_THUMBPOSITION, TB_THUMBTRACK :
begin
Value := SendMessage(GetDlgItem(hWnd, IDC_TRACKBAR), TBM_GETPOS, 0, 0);
Value := Value - 15;
SendMessage(hWnd, WM_SETTEXT, 0, Integer(PChar(IntToStr(Value))));
end;
end;

WM_NOTIFY :
begin
with PNMHdr(lParam)^ do
if PNMHdr(lParam).idFrom = IDC_TRACKBAR then
begin
case PNMHdr(lParam)^.code of
NM_CUSTOMDRAW :
begin
with PNMLVCUSTOMDRAW(lParam)^ do
begin
case nmcd.dwDrawStage of
CDDS_PREPAINT :
begin
Result := CDRF_NOTIFYITEMDRAW;
SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW or CDRF_NOTIFYPOSTPAINT);
end;
CDDS_ITEMPREPAINT :
begin
case nmcd.dwItemSpec of
TBCD_CHANNEL :
begin
PaintItemTrackbar(nmcd.HDC, nmcd.rc, RGB(200, 215, 240), RGB(50, 105, 200));
Result := CDRF_SKIPDEFAULT;
end;
TBCD_THUMB :
begin
if (nmcd.uItemState and ODS_SELECTED) <> 0 then
PaintItemTrackbar(nmcd.HDC, nmcd.rc, RGB(150, 150, 230), RGB(50, 105, 200))
else
PaintItemTrackbar(nmcd.HDC, nmcd.rc, RGB(200, 215, 240), RGB(50, 105, 200));
Result := CDRF_SKIPDEFAULT;
end;
TBCD_TICS :
begin
Result := CDRF_DODEFAULT;
end;
end;
end;
else
Result := CDRF_DODEFAULT;
SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_DODEFAULT);
end; // case nmcd.dwDrawStage of
end; // with PNMLVCUSTOMDRAW(pnmh)^ do
end; // NM_CUSTOMDRAW:

end;
end;
end;

WM_DESTROY :
begin
SetWindowLong(GetDlgItem(hWnd, IDC_TRACKBAR), GWL_WNDPROC, LongInt(OldWndProc));
PostQuitMessage(0);
end;
else
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;
end;

var
WndClass : TWndClassEx =
(
cbSize : SizeOf(TWndClassEx);
Style : CS_HREDRAW or CS_VREDRAW;
lpfnWndProc : @MainWndProc;
cbClsExtra : 0;
cbWndExtra : 0;
hbrBackground : COLOR_3DFACE + 1;
lpszMenuName : nil;
lpszClassName : szClassName;
hIconSm : 0
);
uMsg : TMsg;
hwndMain : Cardinal;
begin
InitCommonControls;
WndClass.hInstance := hInstance;
WndClass.hIcon := 0;
WndClass.hCursor := LoadCursor(0, IDC_ARROW);
RegisterClassEx(WndClass);
hwndMain := CreateWindowEx(0, szClassName, szClassName, WS_CAPTION or WS_VISIBLE or WS_SYSMENU, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), WindowWidth, WindowHeight, 0, 0, hInstance, nil);
while TRUE do
begin
if not GetMessage(uMsg, 0, 0, 0) then
Break;
if not IsDialogMessage(hWndMain, uMsg) then
begin
TranslateMessage(uMsg);
DispatchMessage(uMsg);
end;
end;
ExitCode := uMsg.wParam;
end.[/more]. Добавил изменение цвета при нажатии на ползунок. Правда непонятно как перекрасить контрол, когда он неактивен - запрещаем его через EnableWindow к примеру. Делал как if (nmcd.uItemState and ODS_SELECTED) <> 0 then и if (nmcd.uItemState and ODS_SELECTED) <> 0 then... и менял селектед на CDIS_DISABLED - контрол то рисуется задисейбленым, но даже если он и активен. Правда рисование выполнял в CDDS_ITEMPREPAINT. Это не правильно или я опять не то делаю? Странным показалось то что отрабатывает прекрасно ODS_SELECTED, но не трекбаровское сообщение CDIS_FOCUS, котрое походу и должно предназначаться для такого случая. И хотелось бы прорисовать ползунок пр наведении на него курсора, но он в этом случае тоже не изменяет цвет. Использовал в этом же случае CDIS_HOT, результата нет...
И хотел поинтересоваться как сабклассить трекбар чтобы при нажатии в любом его месте, происходило перемещение ползунка в эту позицию. А то где-то читал что там какой-то тормозной таймер обработки сообщений чтоли у этого контрола и задержка происходят при перемещении ползунка по умолчанию. Ну как-то так. И тогда как в этом случае поступать. Ловить WM_MOUSEMOVE с WM_MOUSELEAVE и переводить координаты курсора? может есть предположения или наработки у кого-нибудь? Спасибо.
Автор: DmitryKz
Дата сообщения: 31.10.2008 16:05
Как через IUnknown определить, запущен ли Ворд?
Через IDispatch это будет GetActiveOleObject('Word.Application'), модуль ComObj. Но мне надо через IUnkown, когда подключен только юнит WordXP.
Автор: delover
Дата сообщения: 31.10.2008 16:22
Если у диспетчера забирать интерфейс, то это не всегда польза. Прога может сломаться после первого же обновления WordXP. )
Автор: DmitryKz
Дата сообщения: 31.10.2008 17:45

Цитата:
обновления WordXP

А почему должен обновляться модуль WordXP???? Я не про программу MS Office Word говорю, а про штатный программный модуль в Дельфи. Мне до ужаса не хочется работать через Диспатч, никакого контроля типов. Мне надо, чтобы программа могла подключиться к уже выполняющемуся экземпляру MS Word. Ну вот, например, можно создать экземпляр Ворд, выполнив
Код: W:=CoWordApplication.Create;
Автор: RomanTim
Дата сообщения: 31.10.2008 18:44
DmitryKz
Код: var
x: IUnknown;
wa: _Application;
begin
if GetActiveObject(CLASS_WordApplication, nil, x) = S_OK then begin
wa := x as _Application;
wa.Caption := '11111';
end;
end;
Автор: fcdobpiy
Дата сообщения: 31.10.2008 19:38
вариант с модулем wordxp это создать экземпляр TwordApplication, дать свойству ConnectKind значение ckRunningInstance . теперь при connect если ворд не запущен то будет сгенерировано исключение, иначе он подключится
Автор: ChiPnGo
Дата сообщения: 31.10.2008 21:55
Пытаюсь загрузить бмп из ресурса, как везде описано. Прога видит, что картинка есть, но в TBitmap не загружает (procedure LoadFromResourceName).

Добавлено:
А, ну ясно. Не то компилю вообще....
Автор: delover
Дата сообщения: 01.11.2008 07:55

Цитата:
почему должен обновляться модуль WordXP

Мне думается, что такие модули проще создавать используя "визарды", создающие "первичное" описание TLB (библиотеки типов). Далее текст обрабатывается в соответствии с представлениями о юзабилити. Как правило, они не меняются. Однако, обновления, "актуальные обновления", могут обновлять "не актуальные" интерфейсы из используемых TLB, использованные при создании WordXP.

-
Успехов.

Добавлено:
В таком случае можно, если уж так хочется, то предусмотреть обе схемы работы с интерфейсом. Кто Вам ручается, что другая программулька не захочет использовать ту возможность которая несколько изменить Ваши представления о совместимости между модулем WordXP и офисным продуктом Word XP.

Добавлено:
Успехов
Автор: DmitryKz
Дата сообщения: 01.11.2008 13:57
delover
Не так уж много интферейсов использует моя программа - испытывал на офисах от 97 до 2007 - все работает.
Автор: Maks150988
Дата сообщения: 02.11.2008 13:39
Так-с-с, с трекбаром разобрался полностью.
Еще вот давно хотелось найти аналог ЧекЛистбокс дельфевый только чтоб на чистом Апи был. Естественно что такой фигней никто не страдает и не перерисовывает контролы, результаты поиска конечно не увенчались успехом, поэтому пришлось подредактировать стандартный Листбокс, немного заовнердравив при этом. Вроде бы все работает как надо, только все не могу придумать как обработать одинарное нажатие правой кнопкой мыши чтоб строка в списке выделялась. Такое например есть в ЛистВью, а Листбокс вроде по умолчанию такое не поддерживает. Может у вас будут какие-нибудь идеи как это можно реализовать?
Ссылка
По ссылке демонстрационная программулька с некоторыми возможностями по управлению чекбоксами в списке.
И вот еще что-то не получается выполнить правильную отрисовку контрола когда в нем строк нет - рисуется мусор какой-то. Я по идее поставил проверку на наличе строк и если они больше -1 то выполняется отрисовка иначе ее нет. Но рисуется и чекбокс и мусор, непонятки вобщем. Заместо этого пробывал выводить просто строчку что список пуст - ну знаете наверное что по центру в первой строке или посередине контрола выводится информация что списк пуст - ну типа этого вобщем хотел реализовать, но выводился опять чекбокс с мусором.
И нашел реализацию на Си, когда нужно тыкнуть на ползунок трекбара чтоб он тут же переместился в нужную нам позицию, когда курсор находится на линии движения. Переделал на делфи. Выглядит вот так, может кому-нибудь нужно будет:

Код: procedure SetPositionTrackbar(Trkb : Thandle);
var
ptPos : TPoint;
rcTrBar : TRect;
GetTrkPos : Integer;
GetTrkWdt : Integer;
GetTrkMax : Integer;
GetTrkMin : Integer;
begin
GetCursorPos(ptPos);
GetWindowRect(Trkb, rcTrBar);
GetTrkWdt := rcTrBar.right - rcTrBar.left - 24;
GetTrkPos := ptPos.x - rcTrBar.left - 12;
GetTrkMax := SendMessage(Trkb, TBM_GETRANGEMAX, 0, 0);
GetTrkMin := SendMessage(Trkb, TBM_GETRANGEMIN, 0, 0);
SendMessage(Trkb, TBM_SETPOS, Integer(TRUE), Integer(GetTrkMin + (GetTrkMax - GetTrkMin) * GetTrkPos div GetTrkWdt));
end;
Автор: DmitryKz
Дата сообщения: 02.11.2008 23:39
Хочу разобраться как в одном Экшене обрабатывать нажатия сразу 24 кнопой на форме. Там просто символы необычных языков. По их нажатию в Эдите(Tnt) появляется слово. Сами кнопки лежат на тулбаре TBX. Каждой назначен Tag - код символа в Юникоде. Код такой:

Код: i:=(Sender as TTBXItem).Tag;
symbol:=widechar(i);
word:=frmGrkIndex.tnteInputWord.Text+symbol;
Автор: ShIvADeSt
Дата сообщения: 03.11.2008 02:00
Maks150988

Цитата:
И вот еще что-то не получается выполнить правильную отрисовку контрола когда в нем строк нет - рисуется мусор какой-то. Я по идее поставил проверку на наличе строк и если они больше -1 то выполняется отрисовка иначе ее нет.

Проверяй на больше нуля, так как скорее всего работаешь с Count, а он с 0 начинается.
Насчет правой кнопки в ЛистБоксе - скорее всего подмена оконной функции на свою собственную и там уже можно что угодно перехватывать. Если в класс оформить - то самый правильный способ.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.