![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как копировать в StringGrid? [D6, Win95/98, Win2k]
ida © (2004-07-04 12:51:00)Как использовать стандартные: Вставить, Копировать в StringGrid?
Обещанная везде работать:
var Mes:TWMCut;
begin
Mes.Msg:=WM_CUT;
Screen.ActiveControl.Dispatch(Mes);
if ActiveControl is TWrapGrid then
with TWrapGrid(ActiveControl). dataSource. DataSetdo Edit
end;
выдает ошибку неизвестных переменых.
Помогите,плз.
GanibalLector (2004-07-06 10:59:00) [1]А че Вы спорите???А ж дал рабочий исходник[2].Вы пробовали???
З.Ы. Фреймы поубирайте и юзайте.
KSergey (2004-07-06 09:16:00) [2]> [14] ida (05.07.04 12:08)
> ну не ругайся. Кто предок StringGrid'а? можно ли его поставить
> вместо TCustomEdit?
Можно
Только зачем, я никак не пойму? До какого свойства WrapGrid'а выходите добраться?
ida (2004-07-05 12:08:00) [3]
> преобразуете ссылку на него к TcustomEdit (кошмар! почему??
> это даже не его предок)
ну не ругайся. Кто предок StringGrid'а? можно ли его поставить вместо TCustomEdit?
KSergey (2004-07-04 19:46:00) [4]2 ida
Утверждаете, что WrapGrid этот переделан из StringGtid
А что тогда DataSet??? Это для DBGrid подходит, но не для StringGtid
Еще раз к этому фрагменту:
if ActiveControl is TWrapGrid then begin
with TcustomEdit(ActiveControl) do
Он просто меня очень беспокоит...
Вдумайтесь наконец, что вы тут делаете: проверяете: активный контрол есть TWrapGrid? если да, то преобразуете ссылку на него к TcustomEdit(кошмар! почему?? это даже не его предок)
Ну компилятор он парень простой: сказано - сделано. И что из того выходит, как вы думаете? Лично мне даже представить страшно...
Я не читал книжки Озерова, но что-то мне очень сомнительно что там есть подобные примеры.
А по поводу помочь... Видите ли, тут придется не помогать, а делать за вас. Так что звиняйте.
KilkennyCat (2004-07-04 15:53:00) [5]
>
> ida (04.07.04 15:40) [10]
у Вас только один грид? к которому привязан попап? так замечательно! определяйте состояние менюшек в событии их вызова. И как-нить попроще для начала, без столь глобально-объектных обращений и With. адресуйтесь непосредственно к единственному гриду. Думаю, использование всего этого ужаса (для меня) выгодно в случае множественных обращений.
ida (2004-07-04 15:43:00) [6]
> И еще. А хоть есть уверенность, что ActiveControl - именно
> гридом окажется?
У меня на форме тока один етот грид. Я думаю, окажется..
ida (2004-07-04 15:40:00) [7]
> KilkennyCat ©
Да какая мне разница чем они там будут активированы, я уже попробовал 3 варианта и не один не пашет. Помогите, плз!!
KilkennyCat (2004-07-04 15:38:00) [8]
> KilkennyCat © (04.07.04 15:37) [8]
Я имею ввиду, страшных для меня.
KilkennyCat (2004-07-04 15:37:00) [9]
> ida (04.07.04 15:33) [6]
я бы вам помог, но честно скажу: я всегда боялся таких страшных вещей, типа TcustomEdit(ActiveControl)... пункты меню я бы активировал как-нить попроще...
KilkennyCat (2004-07-04 15:35:00) [10]
> KSergey © (04.07.04 15:23) [5]
да вроде все видно :) Nномерные - пункты меню, sellength относится уже к КастомЕдиту... А как оно должно работать - хрен его знает. Раз итемы меню всегда не видны, значит, либо if ActiveControl is TWrapGrid then всегда ложен, либо выделение всегда нет и в буфере всегда все, что угодно, но только не текст. Что маловероятно. Вывод? проверка не правильна. а если правильна, значит никогда не вызывается.
ida (2004-07-04 15:33:00) [11]Господа, не издевайтесь, программирую не давно. Приведенные примера взяты из книжки Озерова, и переделаны как смог, не смейтесь, ибо не пнимаю до конца, что творю. Речь идет о данныхв строке WrapGrid'а - это переделанный из StringGrida, умеющий переносить строки.
KSergey (2004-07-04 15:23:00) [12]> if ActiveControl is TWrapGrid then begin
> with TcustomEdit(ActiveControl) do
Ого! Мощно задвинул...
Мммм... а как оно по-вашему должно работать, интересно? И что такое N12 и т.п.?
И главное: ответьте таки на вопросы в [3] KSergey © (04.07.04 15:03)
ida (2004-07-04 15:08:00) [13]Undeclared identifier
Пробовал с помощью.: Screen.ActiveControl.Dispatch(WM_COPY);
Не работает.
Не работает даже процедура активации пунктов динамического меню:
if ActiveControl is TWrapGrid then begin
with TcustomEdit(ActiveControl) do
begin
N12.Visible:=SelLength>0;
N10.Visible:=SelLength>0;
N11.Visible:=ClipBoard.HasFormat(CF_TEXT);
end;
end else
begin
N12.Visible:=false;
N10.Visible:=false;
N11.Visible:=false;
end;
KSergey (2004-07-04 15:03:00) [14]Я так нифига и не понял.
> ida (04.07.04 12:51)
> Как использовать стандартные: Вставить, Копировать в StringGrid?
...
> with TWrapGrid(ActiveControl). dataSource.DataSetdo Edit
Я не пойму про что таки разговор.
Про данные в StringGrid или DataSet???
И еще. А хоть есть уверенность, что ActiveControl - именно гридом окажется? (да и нафиг тут прям таки Wrap, если идет обращение к вполне доступным и не скрытым методам? Впрочем, это уже терминологическая придирка.)
"Обещанная везде работать:"кем обещано????? Ткните пальцем, плиз.
Я его тогда тоже побью! Нифига оно не везде работает! Либо врет нагло, либо не доделал! Дайте мне его! ;)
GanibalLector (2004-07-04 14:03:00) [15]procedure TFrame3.ClearGrid(Grid: TStringGrid);
var x, y: integer;
begin
with Grid do begin
for y := Selection.Top to Selection.Bottom do begin
for x := Selection.Left to Selection.Right do Cells[x, y] := '';
end;
end;
end;
procedure TFrame3.CopyGrid(Grid: TStringGrid; Cut: boolean);
// при Cut = false происходит Copy, а при true Cut
var x, y: integer;
str: string;
begin
str := '';
with Grid do begin
for y := Selection.Top to Selection.Bottom do begin
for x := Selection.Left to Selection.Right do begin
str := str + Cells[x, y];
if Cut then Cells[x, y] := '';
if x < Selection.Right then str := str + #9; //только если несколько в ширину
end;
if y < Selection.Bottom then str := str + #13 + #10;
end;
end;
str:=str+#13+#10; //можно не делать,но по аналогии с Excel
str := str + #0 + #0;
ActivateKeyboardLayout(LoadKeyboardLayout('00000419',0),0); //дабы не было проблем с экспортом!
Clipboard.AsText := str;
end;
procedure TFrame3.PasteGrid(Grid: TStringGrid; Ignore: boolean);
var x, y, i,oldx,oldy: integer;
str, str2: string; En:boolean;
Myrect:TgridRect;
begin
str := Clipboard.AsText;
if (str[length(str)]=#10) and (str[length(str)-1]=#13) then
delete(str,length(str)-1,2); // если это не сделать,то после вставки,он не
//коректно будет закрашен
//если только одна ячейка то так!
x:=0;y:=0;
for i:=1 to length(str) do begin
if str[i]=#9 then x:=x+1;
if str[i]=#13 then y:=y+1;
end;
if (x=0) and (y=0) then begin
with Grid do begin
for y := Selection.Top to Selection.Bottom do begin
for x := Selection.Left to Selection.Right do
Cells[x, y] :=str ;
end;end;
end else begin
i:=1; //а это если много!
str:=str+#9+#9;
y:=Stringgrid1.row;
x:=Stringgrid1.col;
oldx:=Stringgrid1.col;
oldy:=Stringgrid1.row;
while (i < Length(str)) do begin
str2:='';
while (str[i] <> #09) and (str[i] <> #13) and (str[i] <> #10) and
(i < Length(str)) do begin
str2:=str2+str[i]; inc(i);
end;
if str2<>'' then begin stringgrid1.Cells[x,y] :=str2;En:=true;end else en:=false;
if str[i]=#9 then begin
if En=false then begin stringgrid1.Cells[x,y]:='';end ;
x:=x+1;
end;
if str[i]=#13 then begin
if En=false then begin stringgrid1.Cells[x,y]:=''; i:=i+1;end
else i:=i+1;
y:=y+1; x:=oldx;
end;
i:=i+1;
end;
// закрасим вставленное
myRect.Right := oldx;
myRect.Left := x-1;
myRect.Top := oldy;
myRect.Bottom := y;
with Stringgrid1 do begin
Selection:=myRect;end;
end;
end;
procedure TFrame3.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
stringgrid1.Options := stringgrid1.Options + [goEditing];
if [ssCtrl] = Shift then
case Key of
Ord('C'), VK_INSERT: CopyGrid(Sender as TStringGrid, false);
Ord('V'): PasteGrid(Sender as TStringGrid, false);
Ord('X'): CopyGrid(Sender as TStringGrid, true);
end;
if key = vk_delete then clearGrid(StringGrid1);
if [ssShift] = Shift then
case Key of
VK_INSERT:PasteGrid(Sender as TStringGrid, false);
end;
if key = vk_return then begin
if Stringgrid1.Row>=Stringgrid1.RowCount-1 then
Stringgrid1.row:=Stringgrid1.row else
Stringgrid1.row:=Stringgrid1.row+1;
Stringgrid1.EditorMode:=true;end;
end;
procedure TFrame3.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var X2, Y2: integer;
begin
if Button = mbLeft then
with Sender as TStringGrid do begin
MouseToCell(X, Y, X2, Y2);
if (X2 <> LastX) or (Y2 <> LastY) then
Options := Options - [goEditing]
else
begin
Options := Options + [goEditing];
OnMouseDown := nil;
//Perform(WM_LBUTTONDOWN, MK_LBUTTON, Y * 65536 + X);
OnMouseDown := StringGrid1MouseDown;
end;
LastX := X2;
LastY := Y2;
end;
end;
ТИПА вот ТАК!!! Я на этот САБЖ потратил МЕСЯЦ,млин.
TUser (2004-07-04 13:25:00) [16]Что такое 'ошибка неизвестных переменных'?
Накак по-другому до DataSet'а добраться нельзя?
Кто обещал и главное что? Dispath(WM_CUT) вовсе не обязан чего-то вырезать.
И зачем делать потом Edit?