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

» Использование DevExpress

Автор: golkanavt
Дата сообщения: 29.08.2006 19:35
jicoff

Цитата:
А это что за "зверь" такой? В GridView есть такое понятие?

Объясняю - есть грид с тремя уровнями, назовем их Master, Detail1, Detail2. Необходимо блокировать записи в Detail2 по условию в Detail1 и блокировать оба уровня Detail1, Detail2 - по условию в Master. Надеюсь, внятно изложил.
Автор: hobest
Дата сообщения: 29.08.2006 23:32
golkanavt

Мне, например, не понятно само слово "блокировать". Что под этим подразумевается? Просто перевести DetailView в состояние ReadOnly? Если это - то можно на событие FocusedRecordChanged в MasterView переводить DetailView в состояние ReadOnly. Если эти условия получаются из БД и не могут быть изменены в программе, то можно при создании клона DetailView сразу выставлять ReadOnly.
Автор: Widoms
Дата сообщения: 30.08.2006 08:12
Delphi 6, кидаю на форуму dxBarManager
при компиляции вываливается ошибка

Unit dxBar was compiled with a different version of dxCommon.dxDrawText
Автор: hobest
Дата сообщения: 30.08.2006 08:43
Widoms

Возможно где-то есть другие версии файлов, поищи файл dxCommon.pas.
Автор: unfreqient
Дата сообщения: 30.08.2006 11:52
Есть грид 4 (TcxGrid), в нём могут быть разные столбцы. Обрабатываю выделения по

for i:=0 to cxGrid1DBTableView1.Controller.SelectedRowCount-1 do
s[j]:=cxGrid1DBTableView1.Controller.SelectedRecords[i].DisplayTexts[4]

если пользователь перемещает четвёртый столбец, то как к его значению обратиться зная его имя? То есть надо пройти по выделенным и запомнить значения из определённого столбика.
Автор: golkanavt
Дата сообщения: 30.08.2006 12:50
hobest
Да, все верно, под блокировкой имеется ввиду запрет редактирования. Такого свойства как ReadOnly у View нет.

Цитата:
то можно при создании клона DetailView сразу выставлять ReadOnly.

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

Добавлено:
unfreqient
ViewName.GetColumnByFieldName(FieldName);
Автор: unfreqient
Дата сообщения: 30.08.2006 13:16
golkanavt
Благодарен безмерно,
через s[j]:=cxGrid1DBTableView1.GetColumnByFieldName('CODE').EditValue обратился,
но как все выделенные то перебрать?
Автор: golkanavt
Дата сообщения: 30.08.2006 14:01
unfreqient
не понял - выделенные что? записи? так у тебя выше ответ есть:

Код:
for i:=0 to cxGrid1DBTableView1.Controller.SelectedRecordCount-1 do
begin
ARecord := TcxGridDataRow(Controller.SelectedRecords[i]);
...
end;
Автор: unfreqient
Дата сообщения: 30.08.2006 14:15
golkanavt
не доганяю:
я знаю имя столбца, мне нужен массив значений из него по выделенным строкам.
Автор: golkanavt
Дата сообщения: 30.08.2006 14:38

Цитата:
я знаю имя столбца, мне нужен массив значений из него по выделенным строкам.

Вся информация для этого у тебя уже есть, от тебя требовалось лишь сделать маленький шажок самому:

Код:
for i:=0 to cxGrid1DBTableView1.Controller.SelectedRecordCount-1 do
begin
ARecord := TcxGridDataRow(Controller.SelectedRecords[i]);
ColumnID := cxGrid1DBTableView1.GetColumnByFieldName('CODE').index;
ColumnValue[i] :=ARecord.Values[cxGrid1DBTableView1.Columns[ColumnID].Index];
...
end;
Автор: unfreqient
Дата сообщения: 30.08.2006 14:43
golkanavt
Ещё раз спасибо, уже сам догадался, вот так сделать:
for i:=0 to cxGrid1DBTableView1.Controller.SelectedRowCount-1 do
begin
s[j]:=cxGrid1DBTableView1.Controller.SelectedRecords[i].DisplayTexts[cxGrid1DBTableView1.GetColumnByFieldName('CODE').Index];
Автор: jicoff
Дата сообщения: 30.08.2006 14:55
golkanavt

Во-первых, у GridLevel есть событие OnGetGridView. Туда приходит MasterRecord. Событие назначается для DetailLevel. Это событие хорошо использовать для создания разных View. Если у DetailView (паттерна) выставлено свойство Synhronization, то изменение любого свойства одного из клонов, т.е. созданных DetailView по образу паттерна, или самого паттерна, приведет к изменению этого свойства у всех созданных DetailView. В этом случае надо создавать 2 разных паттерна: для одного разрешено редактирование, другому нет.

Есть у Grid событие OnFocusedViewChanged. Можно в нем определять, во-первых, является ли View детейлом, во-вторых, в зависимости от условий MasterRecord - разрешать или запрещать во View редактирование. В этом случае не придется создавать два DetailView паттерна.

Может есть еще способы решения проблемы. На мой взгляд второй лучше, с первым возни будет больше.
Автор: golkanavt
Дата сообщения: 30.08.2006 18:28
jicoff

Цитата:
Есть у Grid событие OnFocusedViewChanged

Вот об этом свойстве не знал, спасибо за информацию, попробую 2ой способ. Хотя скорее всего проще окажется слегка изменить логику работы гридов на форме, отказавшись от такого вложения уровней View.
Автор: jicoff
Дата сообщения: 30.08.2006 19:05
golkanavt

Вообще говоря, по опыту, больше 2-х уровней уже перебор. У нас было 3 и 4, это приводило пользователей в шок, так как начиналась путаница с вертикальными скроллбарами. Да и сам начинал путаться, и уже пользователю не удавалось объяснить что по чем. И пользователя просто отказывались работать с программой. Еще не надо забывать, что существует группировка, которая "подольет масла в огонь".
Автор: educat
Дата сообщения: 31.08.2006 12:16
Нужно добавить строки в cxSpreadSheetBook на форме ReportsForm. На форме есть кнопка
с кодом
ActiveSheet.InsertCells(ActiveSheet.SelectionRect,msAllCol);
всё прекрасно добавляется

Но когда я вызываю ReportsForm (она MDIChild) из другой формы то это не работает.


ReportsForm:=TReportsForm.Create(Application);
//Загружаем файл шаблона, где есть шапка и низ, посередине нужно вставить данные
//из таблицы
ReportsForm.cxSpreadSheetBook1.LoadFromFile('reports\sample.xls');
with ReportsForm.cxSpreadSheetBook1 do begin
ShowHeaders:=false;
Protected:=true;
ShowGrid:=false;
BeginUpdate;
ReportsForm.SetCellText(1,2, dsConst.FieldValues['ORG_SNAME']);
ReportsForm.SetCellText(0,4, datetostr(DatePr.date));
CurRow := 10;
...
While NOT dsTable.EOF do begin
ReportsForm.SetCellText(1,CurRow, FieldByName('N').AsString);
ReportsForm.SetCellText(2,CurRow, FieldByName('FIO').AsString);
//**************
ActiveSheet.InsertCells(ActiveSheet.SelectionRect,msAllCol);
//это не работает, данные вставляются поверх других в шаблоне
//**************

CurRow := CurRow +1;
Next;
end;
end;
//В общем подскажите кто знает как это сделать чтобы добавлять строки, данные то я в ячейки заношу, а строки ну никак и все тут.

Заранее благодарен, за любую помошь
Автор: jicoff
Дата сообщения: 31.08.2006 12:49
educat

А каким образом устанавливается ActiveSheet.SelectionRect? Какие ячейки он объединяет в каждый момент времени?
Автор: DimonXP
Дата сообщения: 31.08.2006 15:09
cxGird.
Два наборы данных связанны как master-detail. В детальном наборе выделяется только первая запись, на другие не могу перейти ни с помощью мыши ни клавиатуры. В чем может быть дело?


Добавлено:
Все разобрался, вообще глупая ошибка, скопировал Grid, а поле DataController.KeyFieldNames = 'CLIENT_ID' изменить забыл
Автор: Dennica
Дата сообщения: 01.09.2006 08:54
В cxGridDBTableView у меня есть одна колонка в которой содержаться для всех строк одни и теже значения (достаточно длинный текст). Мне нужно объединить все ячейки в этом столбце и написать этот текст 1 раз. В принципе получилось так сделать с помощью CellMerging, но когда выставляю OptionsSelection.CellMultiSelect в true, InvertSelect в false да еще разворачиваю грид на весь экран, тормоза просто жуть. На моем компе то работать невозможно (P4 2,40GHz) про пользователей вообще молчу, у них машинки слабенькие. Так вот, может можно без использования CellMerging как-то обойтись?
Автор: hobest
Дата сообщения: 01.09.2006 09:02
Dennica

Если у тебя всегда в одной колонке один и тот же текст, то лучше поставить отдельно стоящий компонент, например, мемо редактор, и выводить текст туда, тем более он большой.
Автор: Dennica
Дата сообщения: 01.09.2006 09:10
hobest
Это самое очевидное конечно, но колонка эта прокричиваемая, т.е. даже может исчезать с экрана, и насамом деле таких колонок 3 в одном гриде.
Автор: educat
Дата сообщения: 01.09.2006 09:54
Насчёт ActiveSheet.SelectionRect то как я понимаю это ячейки выбранные в текущий момент.
И если я работаю с ячейкой SetCellText(1,2, FieldByName('N').AsString) то она и должна быть текущей.
Если пере этим сдепать так
ActiveSheet.SelectCell(0,3,true);
то компонент не может передать фокус текущей ячейке
а если ActiveSheet.SelectCell(0,3,false); то строки все равно не добавляются
Автор: jicoff
Дата сообщения: 01.09.2006 15:09
educat


Цитата:
И если я работаю с ячейкой SetCellText(1,2, FieldByName('N').AsString) то она и должна быть текущей.


Не хочется ломать проект для проверки этого утверждения, но у меня есть сомнения в этом.
Автор: VadimLou
Дата сообщения: 01.09.2006 20:59
educat

Цитата:
SetCellText

Поюзал я этот cx-ких Spread Sheet в одном проекте. Тормозной он жуть. В итоге все их высокоуровненвые методы доступак ячейкам я выбросил (не использую).
Вместо этого обращають напрямую минуя обёртки. Скорость возросла несравненно. В их обёртках при любом обращении создаютяс доп обьекты + какието проверки ... в итоге на больших обьёмах полный пипец.
В общем код, авось на что натолкнёт ... [more]

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
cxSSTypes, cxSSHeaders, cxSSData,
StdCtrls, dxStatusBar, cxMemo, cxButtonEdit, cxTextEdit, cxMaskEdit,
cxSSheet, cxButtons, ExtCtrls, cxDropDownEdit, cxContainer, cxEdit,
cxLabel, cxPC, cxControls;

type

TFormMain = class(TForm)
...
cxSpreadSheet: TcxSpreadSheet;
cxSpreadBook: TcxSpreadSheetBook;
...
public
procedure SetCellText(ACol, ARow: Integer; AText: string);
procedure SetCellDate(ACol, ARow: Integer; ADate: TDateTime);
procedure SetCellFont(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AStyle: TFontStyles; ASize: Integer); overload;
procedure SetCellFont(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AStyle: TFontStyles; ASize: Integer; AFontColor: TColor); overload;
procedure SetCellPattern(ALeftCol, ATopRow, ARightCol, ABottomRow,
ABackgroundColor, AForeGroundColor: Integer; AFillStyle: TcxSSFillStyle);
procedure SetCellFormat(ALeftCol, ATopRow, ARightCol, ABottomRow, AFormat: Integer);
procedure SetCellAlignment(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AHorzAlign: TcxHorzTextAlign; AVertAlign: TcxVertTextAlign);
procedure SetCellBorders(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AEdge: Integer; AStyle: TcxSSEdgeLineStyle); overload;
procedure SetCellBorders(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AEdge: TAlign; AStyle: TcxSSEdgeLineStyle); overload;

end;
...

procedure TFormMain.SetCellText(ACol, ARow: Integer; AText: string);
begin
with cxSpreadBook.ActiveSheet.GetCellObject(ACol, ARow) do
begin
try
Text := AText;
finally
Free; // and free it (important!)
end;
end;
end;

procedure TFormMain.SetCellDate(ACol, ARow: Integer; ADate: TDateTime);
begin
// get a cell object for the request col and row
with cxSpreadBook.ActiveSheet.GetCellObject(ACol, ARow) do
begin
try
DateTime := ADate;
finally
Free; // free it
end;
end;
end;

procedure TFormMain.SetCellFont(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AStyle: TFontStyles; ASize: Integer);
var
i, j: Integer;
begin
with cxSpreadBook.ActiveSheet do // using our active page
for i := ALeftCol to ARightCol do // for each column specified
for j := ATopRow to ABottomRow do // for each row specified
with GetCellObject(i, j) do // get the cell
try
Style.Font.Style := AStyle;
Style.Font.Size := ASize;
finally
Free; // free it
end;
end;

procedure TFormMain.SetCellFont(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AStyle: TFontStyles; ASize: Integer; AFontColor: TColor);
var
i, j: Integer;
begin
with cxSpreadBook.ActiveSheet do // using our active page
for i := ALeftCol to ARightCol do // for each column specified
for j := ATopRow to ABottomRow do // for each row specified
with GetCellObject(i, j) do // get the cell
try
Style.Font.Style := AStyle;
Style.Font.Size := ASize;
Style.Font.FontColor := AFontColor; // ??? - not worked
finally
Free; // free it
end;
end;

procedure TFormMain.SetCellPattern(ALeftCol, ATopRow, ARightCol, ABottomRow,
ABackgroundColor, AForeGroundColor: Integer; AFillStyle: TcxSSFillStyle);
var
i, j: Integer;
begin
with cxSpreadBook.ActiveSheet do // using our active page
for i := ALeftCol to ARightCol do // for each column specified
for j := ATopRow to ABottomRow do // for each row specified
with GetCellObject(i, j) do // get the cell
try
Style.Brush.BackgroundColor := ABackgroundColor;
Style.Brush.ForegroundColor := AForeGroundColor;
Style.Brush.Style := AFillStyle;
finally
Free;
end;
end;

procedure TFormMain.SetCellFormat(ALeftCol, ATopRow, ARightCol, ABottomRow, AFormat: Integer);
var
i, j: Integer;
begin
with cxSpreadBook.ActiveSheet do // using our active page
for i := ALeftCol to ARightCol do // for each column specified
for j := ATopRow to ABottomRow do // for each row specified
with GetCellObject(i, j) do // get the cell
try
Style.Format := AFormat;
finally
Free; // free it
end;
end;

procedure TFormMain.SetCellAlignment(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AHorzAlign: TcxHorzTextAlign; AVertAlign: TcxVertTextAlign);
var
i, j: Integer;
begin
with cxSpreadBook.ActiveSheet do // using our active page
for i := ALeftCol to ARightCol do // for each column specified
for j := ATopRow to ABottomRow do // for each row specified
with GetCellObject(i, j) do // get the cell
try
Style.HorzTextAlign := AHorzAlign;
Style.VertTextAlign := AVertAlign;
finally
Free; // free it
end;
end;

procedure TFormMain.SetCellBorders(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AEdge: Integer; AStyle: TcxSSEdgeLineStyle);
var
i, j: Integer;
begin
with cxSpreadBook.ActiveSheet do // using our active page
for i := ALeftCol to ARightCol do // for each column specified
for j := ATopRow to ABottomRow do // for each row specified
with GetCellObject(i, j) do // get the cell
try
case AEdge of // depending on which edge has been requested
0: Style.Borders.Left.Style := AStyle; // set to the specified style
1: Style.Borders.Top.Style := AStyle;
2: Style.Borders.Right.Style := AStyle;
3: Style.Borders.Bottom.Style := AStyle;
end;
finally
Free; // free it
end;
end;

procedure TFormMain.SetCellBorders(ALeftCol, ATopRow, ARightCol, ABottomRow: Integer;
AEdge: TAlign; AStyle: TcxSSEdgeLineStyle);
var
i, j: Integer;
begin
if AEdge <> alNone then
with cxSpreadBook.ActiveSheet do // using our active page
for i := ALeftCol to ARightCol do // for each column specified
for j := ATopRow to ABottomRow do // for each row specified
with GetCellObject(i, j) do // get the cell
try
case AEdge of // depending on which edge has been requested
alTop:
Style.Borders.Top.Style := AStyle;
alBottom:
Style.Borders.Bottom.Style := AStyle;
alLeft:
Style.Borders.Left.Style := AStyle;
alRight:
Style.Borders.Right.Style := AStyle;
alClient:
begin
Style.Borders.Left.Style := AStyle;
Style.Borders.Top.Style := AStyle;
Style.Borders.Right.Style := AStyle;
Style.Borders.Bottom.Style := AStyle;
end;
end;
finally
Free; // free it
end;
end;

type
TcxSSBookSheetPro = class(TcxSSBookSheet);
TcxSSCellObjectPro = class(TcxSSCellObject);
TcxSSDataStoragePro = class(TcxSSDataStorage);

//
// Загрузка данных из XLS файла
//
procedure TFormMain.BFileGetClick(Sender: TObject);
var
i, CurRow: Integer;
//CellObject: TcxSSCellObject;
SID, sName, sCount, sPalm, sDelim{, sArt}: string;
CHeader, RHeader: TcxSSHeader;
vCursor: TCursor;
vDataStorage, vDataStorageBook: TcxSSDataStoragePro;
//vCellObject: TcxSSCellObject;
//vCellRect: TcxSSCellRec;
begin
if OD.Execute then
begin
fIsFileLoaded := False;
LFileName.Caption := '';

vCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
cxSpreadBook.BeginUpdate;
try

cxSpreadSheet.Sheet.ClearAll();

cxSpreadBook.ActivePage := 0;

cxSpreadBook.ActiveSheet.DeleteCells(Rect(0, 0, cxSpreadBook.ActiveSheet.ColumnCount,
cxSpreadBook.ActiveSheet.RowCount), msAllRow);

CurRow := 0;
SetCellText(0, CurRow, 'Код товара');
SetCellText(1, CurRow, 'Наименование товара');
SetCellText(2, CurRow, 'Количество');
SetCellText(3, CurRow, 'Строка для Palm-а');

SetCellFont(0, 0, 3, 0, [fsBold], 9);
SetCellFont(3, 0, 3, 0, [fsBold], 9, clGray);
SetCellPattern(0, 0, 3, 0, {BackgroundColor:}18 , {ForeGroundColor:}1, fsSolid);
SetCellPattern(3, 0, 3, 0, {BackgroundColor:}23 , {ForeGroundColor:}1, fsSolid);

//TcxSSEdgeLineStyle = (lsDefault, lsThin, lsMedium, lsDashed, lsDotted,
// lsThick, lsDouble, lsHair, lsMediumDashed, lsDashDot, lsMediumDashDot,
// lsDashDotDot, lsMediumDashDotDot, lsSlantedDashDot, lsNone);

SetCellBorders(0, 0, 3, 0, {Edge:}alTop, {Style:}lsDouble);
SetCellBorders(0, 0, 3, 0, {Edge:}alBottom, {Style:}lsThin);
SetCellBorders(0, 0, 0, 0, {Edge:}alLeft, {Style:}lsDouble);
SetCellBorders(3, 0, 3, 0, {Edge:}alRight, {Style:}lsThin);

SetCellBorders(0, 0, 2, 0, {Edge:}alRight, {Style:}lsHair); //lsHair

CHeader := cxSpreadBook.ActiveSheet.Cols;
CHeader.Size[0] := 100;
CHeader.Size[1] := 280;
CHeader.Size[2] := 90;
CHeader.Size[3] := 420;

RHeader := cxSpreadBook.ActiveSheet.Rows;
RHeader.Size[0] := 30;

cxSpreadSheet.LoadFromFile(OD.FileName);
try
if cxSpreadSheet.Sheet.RowCount = 0 then
begin
MessageDlg('Нет строк для загрузки', mtError, [mbOk], 0);
Exit;
end;
if cxSpreadSheet.Sheet.ColumnCount < 3 then
begin
MessageDlg('Недостаточно колонок для загрузки. Должно быть не менее 3-х. Учитываютя первые 3.', mtError,
[mbOk],
0);
Exit;
end;

sDelim := (CDelimiter.Text + ',')[1];

vDataStorage := TcxSSDataStoragePro(TcxSSBookSheetPro(cxSpreadSheet.Sheet).DataStorage);
vDataStorageBook := TcxSSDataStoragePro(TcxSSBookSheetPro(cxSpreadBook.ActiveSheet).DataStorage);
//vCellObject := cxSpreadSheet.Sheet.GetCellObject(0, 0);
//vCell := vDataStorage[0, 0];

for i := 0 to cxSpreadSheet.Sheet.RowCount - 1 do
begin
//
// 1) Читаем входной фал
//
//CellObject := cxSpreadSheet.Sheet.GetCellObject(0, i);
//SID := Trim(CellObject.Text);
SID := Trim(vDataStorage[0, i].Text);
//CellObject.Free;
if StrToIntDef(SID, -1) < 0 then
Continue;
//CellObject := cxSpreadSheet.Sheet.GetCellObject(1, i);
//sName := Trim(CellObject.Text);
sName := Trim(vDataStorage[1, i].Text);
if sName = '' then
Continue;
//CellObject.Free;
//CellObject := cxSpreadSheet.Sheet.GetCellObject(2, i);
//sCount := Trim(CellObject.Text);
sCount := Trim(vDataStorage[2, i].Text);
//CellObject.Free;
if StrToIntDef(sCount, -1) < 0 then
Continue;
// ---
//
// 2) Проверенные строки входного файла запоминаем + формируем строку для экспорта в Палм
//
Inc(CurRow);
//SetCellText(0, CurRow, SID);
vDataStorageBook.SetCellTextEx(0, CurRow, sID, {IsFormula:}False, {Analyse:} False);
//SetCellText(1, CurRow, sName);
vDataStorageBook.SetCellTextEx(1, CurRow, sName, {IsFormula:}False, {Analyse:} False);
//SetCellText(2, CurRow, sCount);
vDataStorageBook.SetCellTextEx(2, CurRow, sCount, {IsFormula:}False, {Analyse:} False);
// Строка для палм-а
sPalm := SID + sDelim
//+ sCount + ' * '
+ sCount + ' **' // skip articul
//+ sArt + ' * '
+ FxtCyrToLat(StringReplace(sName, sDelim, '', [rfReplaceAll, rfIgnoreCase]));
if Length(sPalm) > 60 then
SetLength(sPalm, 60);
//SetCellText(3, CurRow, sPalm);
vDataStorageBook.SetCellTextEx(3, CurRow, sPalm, {IsFormula:}False, {Analyse:} False);
SetCellPattern(3, CurRow, 3, CurRow, {BackgroundColor:}34 , {ForeGroundColor:}1, fsSolid);
// ---
end; // of for;
finally
cxSpreadSheet.Sheet.ClearAll();
end;

fIsFileLoaded := CurRow > 0;
if fIsFileLoaded then
begin
fDelimiterCharLoaded := (CDelimiter.Text + ',')[1];
LFileName.Caption := OD.FileName;

SetCellBorders(0, 1, 0, CurRow, {Edge:}alLeft, {Style:}lsDouble);
SetCellBorders(3, 1, 3, CurRow, {Edge:}alRight, {Style:}lsThin);
SetCellBorders(0, CurRow, 3, CurRow, {Edge:}alBottom, {Style:}lsThin);
SetCellBorders(0, 1, 2, CurRow, {Edge:}alRight, {Style:}lsHair);
end;

finally
cxSpreadBook.EndUpdate;
Screen.Cursor := vCursor;
end;
end;
end;

//
// Передача данных в палм
//
...
procedure TFormMain.BPalmSetClick(Sender: TObject);
var
vCursor: TCursor;
iRow, iRowCount: Integer;
sPalm: string;
vDataStorageBook: TcxSSDataStoragePro;
vDataLines: TStringList;
begin
if fIsFileLoaded then
begin
vCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
vDataLines := nil;
cxSpreadBook.BeginUpdate;
try
cxSpreadBook.ActivePage := 0;
iRowCount := cxSpreadBook.ActiveSheet.RowCount;
vDataStorageBook := TcxSSDataStoragePro(TcxSSBookSheetPro(cxSpreadBook.ActiveSheet).DataStorage);
vDataLines := TStringList.Create;
for iRow := 1 to iRowCount - 1 do
begin
sPalm := vDataStorageBook[3, iRow].Text;
if sPalm <> '' then
begin
vDataLines.Add(sPalm);
end;
end;
if not PalmSymbol_SetScanData(
{DataLines:}vDataLines,
{ComPortNum:} CComPort.ItemIndex + 1,
{DelimiterChar:} fDelimiterCharLoaded,
{DataTranPath:} EDataTran.Text,
) then
EPalmSymbol.Create('Ошибка при передаче данных < Palm "symbol">');
finally
cxSpreadBook.EndUpdate;
Screen.Cursor := vCursor;
vDataLines.Free;
end;
//cxSpreadSheet.Sheet.Cols
//cxSpreadSheet.Sheet.ColumnCount
//cxSpreadSheet.Sheet.ContentColCount
//cxSpreadSheet.Sheet.RowCount
//cxSpreadSheet.Sheet.ContentRowCount
end;
end;

//
// Приём данных с палм
//
...
procedure TFormMain.BPalmGetClick(Sender: TObject);
var
vCursor: TCursor;
//--
S: string;
i, iCount: Integer;
vCallBackData: TPalmSymbolCallBackData;
IsDataLines: Boolean;
vDataLines: TStringList; // Полные строки из палм-а
vSerial: TStringList; // Список серийников
vG_ID: TStringList; // Список кодов товаров
vG_COUNT: TStringList; // Количество в товарной позиции
iG_ID: Currency;
//--
vDataStorageBook: TcxSSDataStoragePro;
CHeader, RHeader: TcxSSHeader;
CurRow: Integer;
begin
vG_ID := nil;
vG_COUNT := nil;
vDataLines := nil;
vSerial := nil;
vCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
try
vDataLines := TStringList.Create;

//
// debug only:
// debug:
//
//
//vDataLines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'palm_symbol_scan_codes_tmp.txt');
//
//
// debug.
//

vSerial := TStringList.Create;
vG_ID := TStringList.Create;
vG_COUNT := TStringList.Create;

vCallBackData.vG_ID := vG_ID;
vCallBackData.vG_COUNT := vG_COUNT;
vCallBackData.ValidCount := 0;
iCount := 0;
IsDataLines := vDataLines.Count > 0;
//
// Запуск процесса приёма из palm или из файла
//
fIsFileSaved := PalmSymbol_GetScanData(False, vSerial, vDataLines,
CComPort.ItemIndex + 1, CDelimiter.Text[1], EDataTran.Text,
@vCallBackData, PalmSymbolParse_DS_ID, IsDataLines
);
if fIsFileSaved and (vCallBackData.ValidCount > 0) then
begin
//
// Обработка полученных серийных номеров: удаляем невалидные записи
//
for i := vG_ID.Count - 1 downto 0 do
begin
// товар
S := vG_ID[i];
iG_ID := StrToCurrDef(S, -1);
if iG_ID <= 0 then
begin
vG_ID.Delete(i);
vSerial.Delete(i);
vG_COUNT.Delete(i);
vDataLines.Delete(i);
end
else
Inc(iCount);
end;
end;
if iCount > 0 then
begin
// Обработка серийников товарных позиций: Напоняем XLS закладку
//
//
cxSpreadBook.BeginUpdate;
try
//
// удаляем старое
//
cxSpreadBook.ActivePage := 1;
cxSpreadBook.ActiveSheet.DeleteCells(Rect(0, 0, cxSpreadBook.ActiveSheet.ColumnCount,
cxSpreadBook.ActiveSheet.RowCount), msAllRow);
//
// заголовок
//
CurRow := 0;
SetCellText(0, CurRow, 'Код товара');
SetCellText(1, CurRow, 'Скан код');
SetCellText(2, CurRow, 'Количество');
SetCellText(3, CurRow, 'Строка из Palm-а');

SetCellFont(0, 0, 3, 0, [fsBold], 9);
SetCellFont(3, 0, 3, 0, [fsBold], 9, clGray);
SetCellPattern(0, 0, 3, 0, {BackgroundColor:}18 , {ForeGroundColor:}1, fsSolid);
SetCellPattern(1, 0, 1, 0, {BackgroundColor:}21 , {ForeGroundColor:}1, fsSolid);
SetCellPattern(3, 0, 3, 0, {BackgroundColor:}44 , {ForeGroundColor:}1, fsSolid);

//TcxSSEdgeLineStyle = (lsDefault, lsThin, lsMedium, lsDashed, lsDotted,
// lsThick, lsDouble, lsHair, lsMediumDashed, lsDashDot, lsMediumDashDot,
// lsDashDotDot, lsMediumDashDotDot, lsSlantedDashDot, lsNone);

SetCellBorders(0, 0, 3, 0, {Edge:}alTop, {Style:}lsDouble);
SetCellBorders(0, 0, 3, 0, {Edge:}alBottom, {Style:}lsThin);
SetCellBorders(0, 0, 0, 0, {Edge:}alLeft, {Style:}lsDouble);
SetCellBorders(3, 0, 3, 0, {Edge:}alRight, {Style:}lsThin);

SetCellBorders(0, 0, 1, 0, {Edge:}alRight, {Style:}lsHair); //lsHair

CHeader := cxSpreadBook.ActiveSheet.Cols;
CHeader.Size[0] := 100;
CHeader.Size[1] := 250;
CHeader.Size[2] := 90;
CHeader.Size[3] := 520;

RHeader := cxSpreadBook.ActiveSheet.Rows;
RHeader.Size[0] := 30;

//
// строки
//
vDataStorageBook := TcxSSDataStoragePro(TcxSSBookSheetPro(cxSpreadBook.ActiveSheet).DataStorage);

for i := 0 to vG_ID.Count - 1 do
begin
Inc(CurRow);
// товар
S := vG_ID[i];
vDataStorageBook.SetCellTextEx(0, CurRow, S, {IsFormula:}False, {Analyse:} False);
// штрих код
S := vSerial[i];
vDataStorageBook.SetCellTextEx(1, CurRow, S, {IsFormula:}False, {Analyse:} False);
// количество
S := vG_COUNT[i];
vDataStorageBook.SetCellTextEx(2, CurRow, S, {IsFormula:}False, {Analyse:} False);
// вся строка
S := vDataLines[i];
vDataStorageBook.SetCellTextEx(3, CurRow, S, {IsFormula:}False, {Analyse:} False);
SetCellPattern(3, CurRow, 3, CurRow, {BackgroundColor:}39 , {ForeGroundColor:}1, fsSolid);
end;

SetCellBorders(0, 1, 0, CurRow, {Edge:}alLeft, {Style:}lsDouble);
SetCellBorders(3, 1, 3, CurRow, {Edge:}alRight, {Style:}lsThin);
SetCellBorders(0, CurRow, 3, CurRow, {Edge:}alBottom, {Style:}lsThin);
SetCellBorders(0, 1, 2, CurRow, {Edge:}alRight, {Style:}lsHair);

//TcxHorzTextAlign = (haGENERAL, haLEFT, haCENTER, haRIGHT, haFILL, haJUSTIFY);
//TcxVertTextAlign = (vaTOP, vaCENTER, vaBOTTOM, vaJUSTIFY);

SetCellAlignment(1, 1, 1, CurRow,
{HorzAlign:} haLEFT, {VertAlign:} vaCENTER);

finally
cxSpreadBook.EndUpdate;
end;
end;
//
// Итого загружено
//
FxtMessageBox(Handle, Format('Загружено "%s" товарных позиций.', [IntToStr(iCount)]),
'Обмен данными с < palm "symbol" >', MB_ICONINFORMATION or MB_OK);
finally
Screen.Cursor := vCursor;
vDataLines.Free;
vSerial.Free;
vG_ID.Free;
vG_COUNT.Free;
end;
end;

[/more]
Автор: educat
Дата сообщения: 04.09.2006 05:19
Спасибо всем кто откликнулся по поводу сxSpreadSheetBook.
После серии экпериментов я выяснил, что у меня в общем-то все было правильно, только я сам в начале защищал лист,
cxSpreadSheetBook1.Protected:=true;
и пытался добавить, а надо то всего лишь наоборот.
А по поводу активной ячейки согласен, что
SetCellText(Col,Row, Text) не делаёт её активной
надо ActiveSheet.SelectCell(Col,Row);
Автор: X11
Дата сообщения: 04.09.2006 12:36

Цитата:
подскажите как в cxGrid обработать MultiSelect. Задача - берем и перетягиваем ДрагЭндДропом записи в другое место, они должны как то обработаться. С одной записью - сделал. а с кучей?


procedure TfmNewArrival.bRecalcSelectedClick(Sender: TObject);
begin
with dbgArrivalDet.DataController do
begin
BeginUpdate;
try
ForEachRow(True, RecalcSelected);
finally
EndUpdate;
end;
end;
end;


procedure TfmNewArrival.RecalcSelected(ARowIndex: Integer; ARowInfo: TcxRowInfo);
Var
id:integer;
begin
with dbgArrivalDet.DataController do begin
//Test whether a row is a data record
if ARowInfo.Level = Groups.GroupingItemCount then
//unbound or provider mode
with dm do begin
id := Values[ARowInfo.RecordIndex, dbgArrivalDetID.Index];
if tArrivalDet.Locate('ID',id,[]) then begin
tArrivalDet.Edit;
tArrivalDetPRICE_RETAIL.Value := tArrivalDetPRICE_W_VAT.Value * ceCoeff.Value;
tArrivalDet.post;
end;//if tArrivalDet.Locate('ID',id,[]) then begin
end;//with dm do begin
end;//with dbgArrivalDet.DataController do begin
end;
Автор: JayDi
Дата сообщения: 04.09.2006 22:36
Скажите, можно ли в cxTreeList (и ему подобные) разбить одну ячейку таблицы на несколько и, если да, то как? И можно ли вставить в ячейку дерева еще одно дерево (т.е. свой контрол)?
-----------------------------
| | dfg | |
| dfg |------| |
fgd |------| dfg | dfg |
| dfg |------| |
| | dfg | |
-----------------------------
Автор: jicoff
Дата сообщения: 05.09.2006 11:03
JayDi

На счет первой части вопроса, не вполне понятно зачем это надо. Скорее всего для дерева - это "чужеродные" данные, связанные только с самой ячейкой и не имеющие никакого отношения к самому дереву. Впрочем это мое мнение.

Что касается второй части вопроса. Можно в ячейке дерева или грида поставить редактор TcxPopupEdit, туда вообще можно все что угодно поместить, но пока ячейка не получит фокуса ничего увидить не получится, т.е. придется переходить по ячейкам, чтобы увидить "детальную" информацию.
Автор: X11
Дата сообщения: 05.09.2006 13:21
В базе (FB2.0) есть текстовое поле, которое может иметь значения 'T' или 'F', т.е. эмуляция boolean-поля. В библиотеке EhLib в столбце грида ставлю значение True в свойстве CheckBox и заполняю свойство KeyList:TStrings значениями:
T;t;1;Y;y;
F;f;0;N;n;

и в гриде появляется вместо 'T' - галочка , а вместо 'F', поле без галочки, так вот. Внимание вопрос: как реализовать похожее в cxGrid???
Автор: vadson6666
Дата сообщения: 05.09.2006 13:29

Цитата:
Внимание вопрос: как реализовать похожее в cxGrid???



Внимание, ответ: ставишь у поля в Пропертиес ЧекБокс, потом в пропериесах есть Валуе Чекед, Грейед, Анчекед, там выставляешь требуемые значения.
Автор: JayDi
Дата сообщения: 05.09.2006 21:09
jicoff
Цитата:
На счет первой части вопроса, не вполне понятно зачем это надо. Скорее всего для дерева - это "чужеродные" данные, связанные только с самой ячейкой и не имеющие никакого отношения к самому дереву. Впрочем это мое мнение.


Дело в том, что эту фичу (вывод таблицы с несколькими разнородными ячейками) нужно реализовать с помощью Дерева -- включение Грида утяжеляет и без того большой exe'шник, поэтому все таблички сделаны с помощью одного контрола.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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