Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.30;
Скачать: CL | DM;

Вниз

Скажите, пжалста, вот у меня есть TreeView в котором есть записи.   Найти похожие ветки 

 
kex86 ©   (2002-09-16 02:25) [0]

Скажите, пжалста, вот у меня есть TreeView в котором есть записи. Как сделать так, чтобы можно было некоторые разделы брать в буфер обмена, вытаскивать оттуда в нужном месте и все это без потери связанных с разделами TObject"ами ?


 
Mystic ©   (2002-09-16 02:44) [1]

1) Восмользоваться API:
- Зарегистрировать свой формат в области обмена
- описать методы по преобразованию элемента TreeView в этот формат и обратно, желательно с совместимостью с другими стандартными форматами (тескт, dib, ...).
- описать процедуру вставки из Clipboard с перебором всех поддерживаемыз форматов
... См (MSDN->Platfotm SDK->Base services->Interprocess communications->Clipboard)

2) Реализовать компонент, который хранит информацию об элементе Clipboard и воспользоваться методами Clipboard.GetComponent, Clipbaord.SetComponent.


 
kex86 ©   (2002-09-16 03:20) [2]

Хоть я мало что понял (не люблю API), спасибо :о)


 
Mystic ©   (2002-09-16 03:28) [3]

Используй второй путь, он без API


 
Mystic ©   (2002-09-16 04:15) [4]

Вот пример реализации второго пути (на форме AddBtn, CopyBtn, PasteBtn, Memo и TreeView):

unit Unit1;

interface

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

type
TMainForm = class(TForm)
TreeView: TTreeView;
Memo: TMemo;
AddBtn: TButton;
CopyBtn: TButton;
PasteBtn: TButton;
procedure FormCreate(Sender: TObject);
procedure TreeViewChange(Sender: TObject; Node: TTreeNode);
procedure AddBtnClick(Sender: TObject);
procedure CopyBtnClick(Sender: TObject);
procedure PasteBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

{$R *.dfm}

{ TTreeViewContainer }

type
TTreeViewContainer = class(TComponent)
private
FCaption: string;
FInfo: TStringList;
procedure SetInfo(const Value: TStringList);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Caption: string read FCaption write FCaption;
property Info: TStringList read FInfo write SetInfo;
end;

constructor TTreeViewContainer.Create(AOwner: TComponent);
begin
inherited;
FInfo := TStringList.Create;
end;

destructor TTreeViewContainer.Destroy;
begin
FInfo.Free;
inherited;
end;

procedure TTreeViewContainer.SetInfo(const Value: TStringList);
begin
FInfo.Assign(Value);
end;




procedure TMainForm.FormCreate(Sender: TObject);
var
S: TStringList;
begin
RegisterClass(TTreeViewContainer);
S := TStringList.Create;
S.Add("Testing sstring");
S.Add("Seconf testing string");
TreeView.Items.AddChildObject(nil, "First", S);
end;

procedure TMainForm.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin
Memo.Lines.Assign(Node.Data);
end;

procedure TMainForm.AddBtnClick(Sender: TObject);
var
S: TStringList;
St: string;
I: Integer;
begin
S := TStringList.Create;
for I := 0 to Random(5)+1 do
S.Add("String" + IntToStr(Random(1000)));
St := "Item" + IntToStr(Random(1000));
with TreeView do
Items.AddChildObject(Selected, St, S);
end;

procedure TMainForm.CopyBtnClick(Sender: TObject);
var
Container: TTreeViewContainer;
Current: TTreeNode;
begin
Current := TreeView.Selected;
if not Assigned(Current) then Exit;
Container := TTreeViewContainer.Create(nil);
try
Container.Caption := Current.Text;
Container.Info := Current.Data;
Clipboard.SetComponent(Container);
finally
Container.Free;
end;
end;

procedure TMainForm.PasteBtnClick(Sender: TObject);
var
S: TStringList;
Container: TComponent;
begin
Container := Clipboard.GetComponent(nil, nil);
if not Assigned(Container) then Exit;
try
try
if not (Container is TTreeViewContainer) then Exit;
with Container as TTreeViewcontainer do
begin
S := TStringList.Create;
S.Assign(Info);
with TreeView do
Items.AddChildObject(Selected, Caption, S);
end;
except
end;
finally
Container.Free;
end;
end;

end.



 
kex86 ©   (2002-09-18 01:15) [5]

Снова спасибо


 
kex86 ©   (2002-09-20 01:23) [6]

Я попробовал твой вариант: в буфер обмена берется только выбранный раздел, а все его подраздела остаются :о(
Можно, конечно, брать по-очереди каждый подраздел, но это надо делать рекурсию, поэтому с большим количеством узлов и связанных с ними объектов система просто зависнет :о(((
Я еще не пойму, почему у TTreeNode есть метод cut, но нет copy и paste?



Страницы: 1 вся ветка

Текущий архив: 2002.09.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
8-98234
BorisMor
2002-06-03 14:22
2002.09.30
MP3 -> WAV


14-98308
Испуганный
2002-09-03 20:23
2002.09.30
Налоговая отбирает компы за отсутствие лицензий


1-98080
Борис
2002-09-19 15:07
2002.09.30
Помогите обратится к компоненту, расположенному на другой форме!


3-97997
firedemon
2002-09-10 13:23
2002.09.30
Надпись QRDBText в QuickRep вылезает за пределы видимости.


14-98338
?
2002-09-05 22:42
2002.09.30
IP