Форум: "Основная";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];
Вниз
Скажите, пжалста, вот у меня есть 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c