Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Нестандартный буфер обмена


Автор: DolgoDoom 26.5.2011, 05:53
Здравствуйте, Уважаемые профессионалы!

Я конено прочитал правила, но к сожалению даже не знаю как подобраться к проблеме. Обшарил нет ничего похожего нет .
Помогите пожалуйста!

А проблема такая, нужно создать буфет обмена состоящий из 14 элементов, два из которых будут .Assign(JPG). 

Подскажите плз, как это можно организовать. 

 Пишу на Delphi.

Автор: Frees 26.5.2011, 08:05
сделай свой формат буфера обмена


Цитата(DolgoDoom @  26.5.2011,  08:53 Найти цитируемый пост)
А проблема такая, нужно создать буфет обмена состоящий из 14 элементов, два из которых будут .Assign(JPG). 

сложи все это в поток (TStream)
и http://www.delphisources.ru/pages/faq/base/clipbrd_and_tmemorystream.html

Автор: CodeMonkey 26.5.2011, 08:19
P.S. По ссылке: 
Цитата
ВАЖНО: Не удаляйте буфер после GlobalAlloc().
 OMG  smile 

Автор: Frees 26.5.2011, 09:39
Цитата(CodeMonkey @  26.5.2011,  11:19 Найти цитируемый пост)
 OMG

это хорошо или плохо?

Автор: RomanEEP 26.5.2011, 10:38
Что так насмешило СodeMonkey? Как гласит msdn здесь http://msdn.microsoft.com/en-us/library/ms649051(v=vs.85).aspx: "If SetClipboardData succeeds, the system owns the object identified by the hMem parameter".

Автор: DolgoDoom 30.5.2011, 12:08
Большое спасибо всем за отзывы и подсказки. Задача почти решена
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Grids,
  StdCtrls, ExtCtrls, RySwapStream, DB, ADODB;

type

  TZadanie = record
    Image : [color=red]???[/color] 
    V1, V2 ,V3 , V4 ,V5 , Key: String[25];
  end;

  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Panel1: TPanel;
    Button3: TButton;
    Grid: TDrawGrid;
    Label3: TLabel;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    ADOQuery2: TADOQuery;
    procedure RadioGroup1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure GridDrawCell(Sender: TObject; ACol, ARow: Integer;
              Rect: TRect; State: TGridDrawState);
  private
    FRow: Integer;
    FGridEnabled: Boolean;
    FStreamKind: Byte;
    Stream : TStream;
    FStreamActive: Boolean;
    FZadanie: TZadanie;
    procedure SetGridEnabled(const Value: Boolean);
    procedure SetStreamActive(const Value: Boolean);
  private
    property StreamActive : Boolean read FStreamActive write SetStreamActive;
    property GridEnabled : Boolean read FGridEnabled write SetGridEnabled;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;
  begin
  try
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM DB1');
  ADOQuery1.Active:=True;
  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('SELECT * FROM DB1');
  ADOQuery2.Active:=True;
  except
  on e:Exception do
  end;
  end;
  FRow := -1;

end;

destructor TForm1.Destroy;
begin
  StreamActive := False;
  inherited;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);

  procedure StreamKind(const Value: Byte);
  begin
    if Value = 1 then Edit1.Color := clWindow
    else Edit1.Color := clBtnFace;
    Edit1.Enabled := Value = 1;
    Button1.Enabled := Value > 0;
    Button3.Enabled := False;
    FStreamKind := Value;
  end;

begin
  StreamActive := False;
  StreamKind(RadioGroup1.ItemIndex);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StreamActive := True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  GridEnabled := True;
end;

const
  ACount = 3;

procedure TForm1.GridDrawCell(Sender: TObject; ACol, ARow: Integer;
          Rect: TRect; State: TGridDrawState);
const
  _FlagsText: Longint = (DT_LEFT or DT_NOCLIP or
              DT_VCENTER or DT_SINGLELINE or DT_END_ELLIPSIS);
var

  Str: String;
begin
  if not GridEnabled then Exit
  else
  if (ARow < 0) or (ARow > ACount) then Exit;

  if FRow <> ARow then
  begin
    FRow := ARow;
    Stream.Position := ARow * SizeOf(TZadanie);
    Stream.Read(FZadanie, SizeOf(TZadanie));
  end;

  case ACol of
    1: Str := FZadanie.Key;
    2: Str := FZadanie.V1;
    3: Str := FZadanie.V2;
    4: Str := FZadanie.V3;
    5: Str := FZadanie.V4;
    6: Str := FZadanie.V5;
    7: Str := FZadanie.Image;
    else Str := '';
  end;

  with Grid.Canvas do
  begin
    if (ARow <> 0) and (ACol <> 0) then
    begin
      if (ARow mod 2) = 0 then Brush.Color := clInfoBk
      else Brush.Color := clWhite;
      FillRect(Rect);
      Font.Color := clBlack;
    end;
    Windows.DrawText(Handle, PChar(Str), Length(Str), Rect, _FlagsText);
  end
end;

procedure TForm1.SetStreamActive(const Value: Boolean);
var
  FZ: TZadanie;
begin
  if FStreamActive = Value then Exit;

  if Value then
  begin
    case FStreamKind of
      1: begin
            if Edit1.Text = '' then Edit1.Text := 'Temp.dat';
            Stream := TFileStream.Create(Edit1.Text, fmCreate);
         end;
      2: Stream := TMemoryStream.Create;
      3: Stream := TRySwapStream.Create;
      else Exit;
    end;

    FZ.Key := 'Ключ';
    FZ.Image := 'Вопрос';
    FZ.Variant1 := 'Вариант 1';
    FZ.Variant2 := 'Вариант 2';
    FZ.Variant3 := 'Вариант 3';
    FZ.Variant4 := 'Вариант 4';
    FZ.Variant5 := 'Вариант 5';
    Stream.Write(FZ, SizeOf(TZadanie));

{выводим первую строку}

    begin
    ADOQuery1.First;
    ADOQuery1.Next;
      FZ.Key := (ADOQuery1.FieldByName('Key').AsString);
      FZ.Image := [color=red]????[/color];
      FZ.Variant1 := (ADOQuery1.FieldByName('V1').AsString);
      FZ.Variant2 := (ADOQuery1.FieldByName('V2').AsString);
      FZ.Variant3 := (ADOQuery1.FieldByName('V3').AsString);
      FZ.Variant4 := (ADOQuery1.FieldByName('V4').AsString);
      FZ.Variant5 := (ADOQuery1.FieldByName('V5').AsString);
      Stream.Write(FZ, SizeOf(TZadanie));

    end;

    Button1.Enabled := False;
    Button3.Enabled := True;
  end else
  begin
    GridEnabled := False;
    Stream.Free;
  end;

  FStreamActive := Value;
end;

procedure TForm1.SetGridEnabled(const Value: Boolean);
begin
  if FGridEnabled = Value then Exit;
  if Value then
  begin
    Grid.RowCount := ACount;
    Grid.Enabled := True;
    Grid.Color := clWindow;
    Button3.Enabled := False;
  end else
  begin
    Grid.RowCount := 2;
    Grid.Enabled := False;
    Grid.Color := clBtnFace;
  end;

  FGridEnabled := Value;
end;

end.


Подскажите пожалуйста как теперь туда запихать Image. Из БД

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)