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

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

Автор: psa1974
Дата сообщения: 15.10.2009 20:14
V1s1ter
Взял в руки Дельфи 2009, создал новый проект, добавил обработчики FormCreate, Button1Click, само собой Button1Click встал перед FormCreate. Переместил Button1Click в конец, нарушив алфавитность. Добавляю Button1Enter - и он снова встал ПЕРЕД FormCreate.
Повторил то же самое с Дельфи 2007 и Дельфи 2010. Те же яйца ...

Varenik
ModelMaker CodeExplorer, вероятно, вешь могучая, сильная и мегаполезная, однако мне тут с вами еще болтать и болтать до тех пор, пока я ее смогу взять из обменника. Однако за совет спасибо
Автор: Frodo_Torbins
Дата сообщения: 15.10.2009 20:54
psa1974
ModelMaker CodeExplorer можно и демку использовать, правда каждый месяц приходится дистилером триал сбрасывать.
Автор: Maks150988
Дата сообщения: 15.10.2009 21:03
Приветствую. Кто знает самый простой способ отрисовки графика, подскажите как вообще организовать кодом все это дело, а то я все никак не пойму как же это сделать, хочется помудрить с отрисовкой линий как это делает диспетчер задач для отображения хронологии загрузки цп, только для своих задач требуется.
Начитался тут в поисковиках значит что мол все советуют использовать функцию Polyline и сами координаты для отрисовки задавать в массиве TPoint. Ну вот мне надо отрисовать линию, я вот такой код сделал, но что-то не рисуется. Может я неправильно истолковал функцию или как-то надо по-другому координаты для точек задавать?

Код: SetLength(pt, 2);
pt[1].x := 0;
pt[1].y := 0;
pt[2].x := 10;
pt[2].y := 10;
Polyline(cdc, pt, 2)
Автор: V1s1ter
Дата сообщения: 15.10.2009 21:55
Maks150988
Вот написал простую демку (10 строк) - разбирайся.
http://www.onlinedisk.ru/file/242705/

Добавлено:
psa1974
Jonnywin


Цитата:
Взял в руки Дельфи 2009, создал новый проект, добавил обработчики FormCreate

Повторил - тоже самое...
Но, блин, ведь писал модуль по графике в объекте методов под сотню и все добавлялись в конец. В общем модуль распух и стал я в нем путаться. Думаю дай отсортирую, чтоб вставлялось аопо алфавиту - протрахался целый день (почему и запомнил это дело) все отсортировал и стало вставляться в середину. Может версия была другая или без апдейтов...
В любом случае приношу извинения за дезинформацию.
Автор: Frodo_Torbins
Дата сообщения: 15.10.2009 23:37
V1s1ter
А настройки Explorer-а не могли повлиять на порядок вставки, там ведь есть соответствующие радиобатоны?
Автор: psa1974
Дата сообщения: 16.10.2009 00:10
V1s1ter

Цитата:
В любом случае приношу извинения за дезинформацию

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

Цитата:
ModelMaker CodeExplorer можно и демку использовать, правда каждый месяц приходится дистилером триал сбрасывать.

Спасибо конечно, но такие танцы с бубном - это уж точно чересчур только для выполнения нужного порядка создания кода


Добавлено:
Frodo_Torbins

Цитата:
А настройки Explorer-а не могли повлиять на порядок вставки

Глянул счас - у меня стоит:
Explorer sorting: Source
Если бы эта настройка влияла, не было бы всего этого разговора...
Автор: ShIvADeSt
Дата сообщения: 16.10.2009 02:11
Maks150988

Цитата:
Просто код с помощью LineTo и MoveToEx кажется мне еще сложным для понимания

Набросал вот (несмотри на OnPaint - рисуется все на АПИ)

Код:
procedure TForm1.FormPaint(Sender: TObject);
procedure Line(DC:HDC; x1,y1,x2,y2:integer);
begin
MoveToEx(DC, x1,y1,nil);
LineTo(DC, x2,y2);
end;

procedure PolylineEx(DC:HDC; Points:array of TPoint);
var
i :integer;
begin
for i := 1 to High(Points) do Line(DC,Points[i-1].x,Points[i-1].y,Points[i].x,Points[i].y)
end;
var
lp :array of TPoint;

begin
Line(Form1.Canvas.Handle,100,100,200,200);
SetLength(lp,3);
lp[0].x:=100;
lp[0].y:=150;
lp[1].x:=200;
lp[1].y:=250;
lp[2].x:=150;
lp[2].y:=100;
PolylineEx(Form1.Canvas.Handle, lp);
SetLength(lp,0);
end;
Автор: JohnSilver182
Дата сообщения: 16.10.2009 10:25
Нашел процедуру : Пихаеш HTML строку, а тебе все дела .

Вот только WebBrowser1.ExecWB(OLECMDID_PRINT,0 ); срабатывает
на WB_LoadHTML(self.WebBrowser1,'<html><body><p>суко</p></body></html>');
А если что то большое пихать то выводит пустую страницу .

Код: procedure WB_LoadHTML(WebBrowser: TWebBrowser; HTMLCode: string);
var
sl: TStringList;
ms: TMemoryStream;
begin
WebBrowser.Navigate('about:blank');
while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do
Application.ProcessMessages;

if Assigned(WebBrowser.Document) then
begin
sl := TStringList.Create;
try
ms := TMemoryStream.Create;
try
sl.Text := HTMLCode;
sl.SaveToStream(ms);
ms.Seek(0, 0);
(WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
finally
ms.Free;
end;
finally
sl.Free;
end;
end;
end;
Автор: volser
Дата сообщения: 16.10.2009 14:23
JohnSilver182
Попробуй так:

Код: (WebBrowser.Document as IHTMLDocument2).body.innerHTML := HTMLCode;
Автор: Maks150988
Дата сообщения: 16.10.2009 23:04
V1s1ter
Спасибо, но там VCL, пробовал код подставлять для своих нужд, чего-то не получилось.
ShIvADeSt
Так, посмотрел, вроде какая-то фигня получилась. Только есть один вопрос. Как развернуть HDC по горизонтали. Всякая фигня попадается в интернете, а толку ноль.
[more=Дальше]unit F_GridStat;

interface

uses
Windows, Messages;

const
SG_SETBKGNDCOLOR = WM_USER + 101; // цвет фона графика
SG_SETGRIDCOLOR = WM_USER + 102; // цвет сетки графика
SG_SETLINECOLOR = WM_USER + 103; // цвет линий графика
SG_SETSIZETHICKX = WM_USER + 104; // шаг сетки по горизонтали
SG_SETSIZETHICKY = WM_USER + 105; // шаг сетки по вертикали
SG_SETNEWGRIDLINE = WM_USER + 106; // добавление новой координаты
SG_CLEARGRIDLINE = WM_USER + 107; // очистка сетки

procedure CreateStaticGridW(hWnd: Thandle);
procedure RemoveStaticGridW(hWnd: Thandle);

implementation

const
StatGridProp = 'UxGridPrtSublassInfo';

type
TMainWndProc = function(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
P_GRID_PRO = ^T_GRID_PRO;
T_GRID_PRO = packed record
WndProc : TMainWndProc;
clrBkgnd: TColorRef;
clrGrid : TColorRef;
clrLine : TColorRef;
sThickX : Byte;
sThickY : Byte;
Points : Array of TPoint;
maxLines: Integer;
end;

var
pgp: P_GRID_PRO;

//

procedure LineEx(hdc: HDC; x1, y1, x2, y2: Integer);
begin
MoveToEx(hdc, x1, y1, nil);
LineTo(hdc, x2, y2);
end;

//

procedure PolylineEx(hdc: HDC; Points: Array of TPoint);
var
I: Integer;
begin
for I := 1 to High(Points) do
LineEx(hdc, Points[I - 1].x, Points[I - 1].y, Points[I].x, Points[I].y);
end;

//

procedure DrawGridEx(hdc: HDC; hWnd: HWND; pgp: P_GRID_PRO);
var
rc : TRect;
iWidth : Integer;
iHeight: Integer;
begin
GetClientRect(hWnd, rc);
iWidth := rc.Right - rc.Left;
iHeight := rc.Bottom - rc.Top;
for iHeight := 0 to iHeight do
for iWidth := 0 to iWidth do
if (not ((iHeight mod pgp^.sThickY) <> 0)) or (not ((iWidth mod pgp^.sThickX) <> 0)) then
SetPixel(hdc, iWidth, iHeight, pgp^.clrGrid);
end;

//

function GridWndProc_OnWmPaint(hWnd: HWND; pgp: P_GRID_PRO): LRESULT;
var
rc : TRect;
ps : TPaintStruct;
hbmNew: HBITMAP;
hbmOld: HBITMAP;
cdc : HDC;
PenNew: HPEN;
PenOld: HPEN;
nBrush: HBRUSH;
begin
GetClientRect(hWnd, rc);

BeginPaint(hWnd, ps);

cdc := CreateCompatibleDC(ps.hdc);
hbmNew := CreateCompatibleBitmap(ps.hdc, rc.Right - rc.Left, rc.Bottom - rc.Top);
hbmOld := SelectObject(cdc, hbmNew);

nBrush := CreateSolidBrush(pgp^.clrBkgnd);
FillRect(cdc, rc, nBrush); // FrameRect

PenNew := CreatePen(PS_SOLID, 1, pgp^.clrLine);
PenOld := SelectObject(cdc, PenNew);

DrawGridEx(cdc, hWnd, pgp);

PolylineEx(cdc, pgp^.Points);

DeleteObject(nBrush);

BitBlt(ps.hdc, rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top, cdc, 0, 0, SRCCOPY);

SelectObject(cdc, PenOld);
DeleteObject(PenNew);
SelectObject(cdc, hbmOld);
DeleteObject(hbmNew);
DeleteDC(cdc);

EndPaint(hWnd, ps);

//
Result := 0;
end;

//

function GridWndProc_OnSgSetBkgndColor(hWnd: HWND; pgp: P_GRID_PRO; lParam: LPARAM): LRESULT;
begin
pgp^.clrBkgnd := TColorRef(lParam);
RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE);
Result := 0;
end;

//

function GridWndProc_OnSgSetGridColor(hWnd: HWND; pgp: P_GRID_PRO; lParam: LPARAM): LRESULT;
begin
pgp^.clrGrid := TColorRef(lParam);
RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE);
Result := 0;
end;

//

function GridWndProc_OnSgSetLineColor(hWnd: HWND; pgp: P_GRID_PRO; lParam: LPARAM): LRESULT;
begin
pgp^.clrLine := TColorRef(lParam);
RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE);
Result := 0;
end;

//

function GridWndProc_OnSgSetSizeThickX(hWnd: HWND; pgp: P_GRID_PRO; lParam: LPARAM): LRESULT;
begin
pgp^.sThickX := Byte(lParam);
RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE);
Result := 0;
end;

//

function GridWndProc_OnSgSetSizeThickY(hWnd: HWND; pgp: P_GRID_PRO; lParam: LPARAM): LRESULT;
begin
pgp^.sThickY := Byte(lParam);
RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE);
Result := 0;
end;

//

function GridWndProc_OnSgSetNewGridLine(hWnd: HWND; pgp: P_GRID_PRO; lParam: LPARAM): LRESULT;
begin
Inc(pgp^.maxLines);
SetLength(pgp^.Points, pgp^.maxLines);
pgp^.Points[pgp^.MaxLines - 1].X := LoWord(lParam);
pgp^.Points[pgp^.MaxLines - 1].Y := HiWord(lParam);
RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE);
Result := 0;
end;

//

function GridWndProc_OnSgClearGridLine(hWnd: HWND; pgp: P_GRID_PRO; lParam: LPARAM): LRESULT;
begin
pgp^.maxLines := 0;
SetLength(pgp^.Points, pgp^.maxLines);
RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE);
Result := 0;
end;

//

function GripWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin

pgp := P_GRID_PRO(GetPropW(hWnd, StatGridProp));

if (pgp = nil) then
begin
Result := DefWindowProcW(hWnd, uMsg, wParam, lParam);
Exit;
end;

case uMsg of

//

WM_DESTROY:
begin
RemoveStaticGridW(hWnd);
end;

//

WM_PRINTCLIENT, WM_PAINT:
begin
Result := GridWndProc_OnWmPaint(hWnd, pgp);
end;

//

SG_SETBKGNDCOLOR:
begin
Result := GridWndProc_OnSgSetBkgndColor(hWnd, pgp, lParam);
end;

//

SG_SETGRIDCOLOR:
begin
Result := GridWndProc_OnSgSetGridColor(hWnd, pgp, lParam);
end;

//

SG_SETLINECOLOR:
begin
Result := GridWndProc_OnSgSetLineColor(hWnd, pgp, lParam);
end;

//

SG_SETSIZETHICKX:
begin
Result := GridWndProc_OnSgSetSizeThickX(hWnd, pgp, lParam);
end;

//

SG_SETSIZETHICKY:
begin
Result := GridWndProc_OnSgSetSizeThickY(hWnd, pgp, lParam);
end;

//

SG_SETNEWGRIDLINE:
begin
Result := GridWndProc_OnSgSetNewGridLine(hWnd, pgp, lParam);
end;

//

SG_CLEARGRIDLINE:
begin
Result := GridWndProc_OnSgClearGridLine(hWnd, pgp, lParam);
end;

else
Result := CallWindowProcW(@pgp^.WndProc, hWnd, uMsg, wParam, lParam);
end;

end;

//

procedure CreateStaticGridW(hWnd: Thandle);
begin

RemoveStaticGridW(hWnd);

New(pgp);

ZeroMemory(pgp, SizeOf(pgp));
pgp^.WndProc := TMainWndProc(Pointer(GetWindowLongW(hWnd, GWL_WNDPROC)));
pgp^.clrBkgnd := RGB(0, 0, 0);
pgp^.clrGrid := RGB(0, 128, 64);
pgp^.clrLine := RGB(255, 255, 0);
pgp^.sThickX := 11;
pgp^.sThickY := 11;
pgp^.maxLines := 0;
SetLength(pgp^.Points, pgp^.maxLines);

SetPropW(hWnd, StatGridProp, Cardinal(pgp));

SetWindowLongW(hWnd, GWL_WNDPROC, Longint(@GripWndProc));

RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE);

end;

//

procedure RemoveStaticGridW(hWnd: Thandle);
begin

pgp := P_GRID_PRO(GetPropW(hWnd, StatGridProp));
if (pgp <> nil) then
begin

RemovePropW(hWnd, StatGridProp);

SetWindowLongW(hWnd, GWL_WNDPROC, Longint(@pgp^.WndProc));

Dispose(pgp);
end;

end;

end.[/more]

[more=Инициализация] CreateStaticGridW(GetDlgItem(hWnd, IDC_STATIC_GRAPHIC));
SendMessageW(GetDlgItem(hWnd, IDC_STATIC_GRAPHIC), SG_SETBKGNDCOLOR, 0, RGB(0, 0, 0));
SendMessageW(GetDlgItem(hWnd, IDC_STATIC_GRAPHIC), SG_SETGRIDCOLOR, 0, RGB(0, 128, 64));
SendMessageW(GetDlgItem(hWnd, IDC_STATIC_GRAPHIC), SG_SETLINECOLOR, 0, RGB(255, 255, 0));
SendMessageW(GetDlgItem(hWnd, IDC_STATIC_GRAPHIC), SG_SETSIZETHICKX, 0, 11);
SendMessageW(GetDlgItem(hWnd, IDC_STATIC_GRAPHIC), SG_SETSIZETHICKY, 0, 11);
//
SendMessageW(GetDlgItem(hWnd, IDC_STATIC_GRAPHIC), SG_SETNEWGRIDLINE, 0, MakeLong(0, 0));
SendMessageW(GetDlgItem(hWnd, IDC_STATIC_GRAPHIC), SG_SETNEWGRIDLINE, 0, MakeLong(35, 12));
SendMessageW(GetDlgItem(hWnd, IDC_STATIC_GRAPHIC), SG_SETNEWGRIDLINE, 0, MakeLong(45, 42));
[/more]
Вобщем кому интересна сама идея. Я та кпонял что нужно создать переменную в которой требуется хранить число точек и по ней ориентироваться при отрисовке линий. Также хочется при каждом добавлении линии на контрол прокручивать всю отрисовку влево - ну как везде вот это все организовано впринципе для удобности и наглядности, ну или хотя бы подскажиет кто знает какими функциями это сделать. Просто пока таймер не добавил себе на диалог, посему не знаю как вообще управлять таким контролом.
Автор: V1s1ter
Дата сообщения: 17.10.2009 00:41
Maks150988

Цитата:
но там VCL,

Дык, Вы вроде ограничений не давали...

Цитата:
Как развернуть HDC по горизонтали

!? ... HDC это просто число, как его развернуть по горизонтали.
Или я туплю или Вы вопросы пишите: слово написал три в уме.
Или Вы уже давненько спрашиваете, а я пропустил мимо Ваши посты?
В общем напиши толком, что нужно, какие ограничения (условия) и для чего.
Тогда есть шанс получить правильный ответ.
Автор: Maks150988
Дата сообщения: 17.10.2009 10:16
V1s1ter
Ну я просто устанавливал Delphi буз pas файлов, поэтому я без понятия что там за канвасный Polyline, да и код-то собственно похожий.
Ну я просто не так выразился. Развернуть мне надо координаты по горизонтали для отрисовки графика. Сейчас если рисовать график, то надо слева-направо, хочется от правой границы его вырисовывать. вот, может есть способ попроще как-то корректировать Rect. Мне пока сложновато вот это все представить как коррдинаты для каждой точки оборачивать. Ну или может есть какой компонент простенький чтоб его поковырять на код.
Автор: V1s1ter
Дата сообщения: 17.10.2009 18:06
Maks150988

Цитата:
лева-направо, хочется от правой границы


Цитата:
Мне пока сложновато

Я посмотрел на код который Вы выкладывали и почитал Ваши вопросы. Код посложнее чем вопросы... Ну да ладно.
Для зеркального отображения графика горизнотали (зеркализация относительно вертикальной оси) нужно воспользоваться формулой
Zx := 2*W-Nx
где
Zx - новая координата X зеркального графика
W - координата X верикальной оси зеркализации
Nx - координата X нормального графика
Пример
нормальный график XY (1, 1) (2, 2) (3, 2) (4, 3)
отзеркалить относительно оси X=2.5 (середины графика)
W = 2.5
зеркальный график XY (4, 1) (3, 2) (2, 2) (1, 3)

отзеркалить относительно оси X=0
W = 0
зеркальный график XY (-1, 1) (-2, 2) (-3, 2) (-4, 3)

отзеркалить относительно оси X=1
W = 0
зеркальный график XY (1, 1) (0, 2) (-1, 2) (-2, 3)

Если не ошибся - где-то так.
Автор: JohnSilver182
Дата сообщения: 18.10.2009 15:26

Цитата:
JohnSilver182
Попробуй так:
Код:
(WebBrowser.Document as IHTMLDocument2).body.innerHTML := HTMLCode;

Слався volser великий шаман !!!

Автор: JohnSilver182
Дата сообщения: 19.10.2009 18:11
Потоки

Вот код по "убиению" простого потока

Код: procedure TSuper.Execute;
begin
while not self.Terminated do sleep(1000);
if self.Terminated then FreeOnTerminate:=true;
end;
Автор: volser
Дата сообщения: 19.10.2009 19:19
JohnSilver182
Что значит "поток который вызывает N-количество классов"? Каждый класс создает свой поток который уничтожается после окончания выполнения. Или сделайте какой то класс - менеджер потоков. Он будет создавать и уничтожать потоки.
Автор: JohnSilver182
Дата сообщения: 19.10.2009 20:38
volser Я имел ввиду что юзер нажал на кнопку Отмена . В коде потока можно написать типа if self.Terminated then exit; . Но если поток вызвал класс \ процеру которая выполняется чуть больше чем дохрена времени, то тут есть над чем подумать !

Автор: psa1974
Дата сообщения: 19.10.2009 22:18
JohnSilver182

Цитата:
как убить поток который вызывает N-количество классов

Правильнее сказать наверное так:
как убить поток, вызывающий N-количество (экземпляров) классов?
Потому что в исходном варианте можно понять именно так, а можно иначе:
как убить поток, вызываемый N-количеством (экземпляров) классов?
Если речь о первом варианте вопроса и касается классов, то все просто: в конструкторе класса передаешь ссылку на поток, создающий экземпляр этого класса. А в самом классе там где выполняются "глубинные процессы по обработке" проверяешь значение св-ва Terminated твоего потока. Если поток Terminated, то экземпляр класса должен все прекратить. А в обработчике OnTerminate потока ожидать пока экземпляры класса не закончат обработку и не просигналят об этом (делается элементарно через булевое поле класса - флаг), после чего разрушить эти экземпляры. Только после этого поток будет завершен.
Аналогично с какой-либо функцией - ей ссылку на поток передаешь в качестве одного из параметров... Вроде так.
Автор: Andrey128
Дата сообщения: 20.10.2009 06:28
Если под Windows 7 в FAR'е копировать файл, то на панели задач в иконке появляется прозрачный прогрессбар.
Как это реализовать с помощью Delphi?
Автор: data man
Дата сообщения: 20.10.2009 07:53
Andrey128
Навороченный вариант (полная поддержка W7 Taskbar'а) - http://www.gumpi.com
Архив бета-версии

Вариант попроще (только прогресс-бар) http://alex.ciobanu.org/?p=215
Автор: SIgor33
Дата сообщения: 20.10.2009 08:13
Подскажите как в delphi скопировать дипазон ячеек с листа excel и вставить их на том же листе только в другое место
Автор: andrewtishkin
Дата сообщения: 20.10.2009 08:35
SIgor33
Попробуй включить запись макроса, проделай эту операцию ручками, ну а потом проанализируй полученный код макроса...
Автор: Vladkyr
Дата сообщения: 20.10.2009 09:05
SIgor33
Попробуй так:

Код:
// Копируем Range
ExcelObj.Range['A1:C3'].Copy;
// Указываем место, куда копировать
Worksheet.Cells[10, 1].Select;
// Копируем
Worksheet.Paste;
Автор: Andrey128
Дата сообщения: 20.10.2009 10:25
data man
Спасибо за наводку!
Сейчас сижу на D2009, краем глаза глянул исходники D2010, а там уже описан интрефейс ITaskbarList3.
Дождусь FIBPlus для D2010 и тогда уже реализую задуманное.
Автор: volser
Дата сообщения: 20.10.2009 10:37
Andrey128
FIBPlus давно вышел под D2010.
Автор: JohnSilver182
Дата сообщения: 20.10.2009 10:57

Цитата:
как убить поток, вызываемый N-количеством (экземпляров) классов?
Если речь о первом варианте вопроса и касается классов, то все просто: в конструкторе класса передаешь ссылку на поток, создающий экземпляр этого класса. А в самом классе там где выполняются "глубинные процессы по обработке" проверяешь значение св-ва Terminated твоего потока


ШАМАН !!!
Автор: psa1974
Дата сообщения: 20.10.2009 12:43
JohnSilver182
Классический пример взаимодействия объекта, создающего другие объекты, с этими созданными им объектами - коллекции (TCollection) и элементы коллекций (TCollectionItem). Там каждый элемент коллекции "знает" своего владельца и взаимодействует с ним. Посмотри как там это сделано...
Автор: pakusya
Дата сообщения: 20.10.2009 12:52
Здравствуйте. Помогите пожалуйста с checkbox. даны две формы , на главной форме установлен checkbox ,если он отмечен, то во второй форме в Memo добавляется строка "житель Владивостока ". Объясните пожалуйста как это сделать
Автор: Vladkyr
Дата сообщения: 20.10.2009 13:45
pakusya

делается так:

Код:
procedure TForm1.checkbox1Click(Sender: TObject);
begin
Form2.Memo1.Lines.Add('житель Владивостока');
end;
Автор: SIgor33
Дата сообщения: 20.10.2009 14:13
andrewtishkin
в excel макрос выглядит так
Worksheets("Сводный").Range(Worksheets("Сводный").Cells(1, 36), Worksheets("Сводный").Cells(2228, 39)).Copy _
Destination:=Worksheets("Сводный").Range(Worksheets("Сводный").Cells(1, 40), Worksheets("Сводный").Cells(2228, 43)
и все работает
а как delphi это приделать не получается
хотел попробовать совет
Vladkyr

Цитата:
ExcelObj.Range['A1:C3'].Copy;
// Указываем место, куда копировать
Worksheet.Cells[10, 1].Select;
// Копируем
Worksheet.Paste;

Но сдесь ни лист не указан и дипазон как то странно задан


Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


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