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

» Использование DevExpress (часть 4)

Автор: Cryogen2003
Дата сообщения: 18.02.2010 08:29
vladman
Да без проблем могу дать. Сейчас только найду это место. Но факт в том, что раньше работало, а сейчас не работает. Но при этом я ничего не менял

[more=Пример]Procedure TdmdMain.SetSpellChecker(IsUse: Boolean);
Var
Temp: TdxSpellCheckerDictionaryItem;
TempPath: String;
Begin
If IsUse Then
Begin
Try
TempPath := dmdMain.IniOptions.MyDocFolder + ReportLocalDir + DelimChar;

dxSpellChecker1.AutoLoadDictionaries := False;
dxSpellChecker1.CheckAsYouTypeOptions.Active := False;

dxSpellChecker1.DictionaryItems.Clear;
{$I-}
If (FileExists(TempPath + EnglishAff)) And
(FileExists(TempPath + EnglishDic)) Then
Begin
Temp := dxSpellChecker1.DictionaryItems.Add;
Temp.DictionaryTypeClass := TdxOpenOfficeDictionary;
TdxOpenOfficeDictionary(Temp.DictionaryType).DictionaryPath :=
TempPath + EnglishDic;
TdxOpenOfficeDictionary(Temp.DictionaryType).GrammarPath :=
TempPath + EnglishAff;
TdxOpenOfficeDictionary(Temp.DictionaryType).Enabled := True;
End;

If (FileExists(TempPath + RussianAff)) And
(FileExists(TempPath + RussianDic)) Then
Begin
Temp := dxSpellChecker1.DictionaryItems.Add;
Temp.DictionaryTypeClass := TdxOpenOfficeDictionary;
TdxOpenOfficeDictionary(Temp.DictionaryType).DictionaryPath :=
TempPath + RussianDic;
TdxOpenOfficeDictionary(Temp.DictionaryType).GrammarPath :=
TempPath + RussianAff;
TdxOpenOfficeDictionary(Temp.DictionaryType).Enabled := True;
End;

If ((FileExists(TempPath + RussianAff)) And
(FileExists(TempPath + RussianDic))) Or
((FileExists(TempPath + EnglishAff)) And
(FileExists(TempPath + EnglishDic))) Then
Begin
Temp := dxSpellChecker1.DictionaryItems.Add;
Temp.DictionaryTypeClass := TdxUserSpellCheckerDictionary;
TdxUserSpellCheckerDictionary(Temp.DictionaryType).Enabled := False;
TdxUserSpellCheckerDictionary(Temp.DictionaryType).DictionaryPath :=
TempPath + UserDic;
TdxUserSpellCheckerDictionary(Temp.DictionaryType).Enabled := True;

dxSpellChecker1.AutoLoadDictionaries := True;
dxSpellChecker1.CheckAsYouTypeOptions.Active := True;
dxSpellChecker1.UseThreadedLoad := True;
dxSpellChecker1.LoadDictionaries;

dxSpellCheckerSpellingOptionsDialogClass := TSpellingOptionsForm;
End;
{$I+}
Except

End;
End
Else
Begin
dxSpellChecker1.AutoLoadDictionaries := False;
dxSpellChecker1.CheckAsYouTypeOptions.Active := False;
dxSpellChecker1.DictionaryItems.Clear;
dxSpellChecker1.UnloadDictionaries;
End;
End;[/more]
Автор: jonikDk
Дата сообщения: 18.02.2010 08:45
vladman

Цитата:
Если бы вы просматривали сообщения не только касательно ваших проблем, то вы бы нашли решение вашей проблемы без проблем, каламбурчик получился . Недавно, буквально на прошлой странице, AvGSoft интересовался решением подобного вопроса и, предложенное решение, http://forum.ru-board.com/topic.cgi?forum=33&topic=10884&start=180#12 вроде бы помогло.

ну так у X11 так и было реализовано... или я чего то не то смотрел. При сохранении в файл TdxMemDataSet использует событие Getvalue и расшифровывает поле. А его это не устраивало, ему в файле нужно было зашифрованное поле, так как оно записалось в DataSet, а то что оно записалось зашифрованное он это тоже в примере показал.
Автор: X11
Дата сообщения: 18.02.2010 10:03

Цитата:
Если бы вы просматривали сообщения не только касательно ваших проблем, то вы бы нашли решение вашей проблемы без проблем, каламбурчик получился . Недавно, буквально на прошлой странице, AvGSoft интересовался решением подобного вопроса и, предложенное решение, http://forum.ru-board.com/topic.cgi?forum=33&topic=10884&start=180#12 вроде бы помогло.

В моём случае в файл сохраняется РАСШИФРОВАННОЕ значение.

(сделал с доп. переменными по Вашему примеру, всё равно)

Код:
procedure TfmFtpUpdater.tUpdaterPasswordGetText(Sender: TField;
var Text: string; DisplayText: Boolean);
begin
if VarIsNull(Sender.Value) then Exit;

Text := VarToStr(Sender.Value);
Text := Decrypt(Text, kd);
end;

procedure TfmFtpUpdater.tUpdaterPasswordSetText(Sender: TField;
const Text: string);
var
vText: string;
begin
vText := Encrypt(Text, ke);
Sender.Value := vText;
end;
Автор: vladman
Дата сообщения: 18.02.2010 10:33
X11

Цитата:
Проблема ещё в том, что cxGrid отображает зашифрованное значение поля. Только я вхожу в режим редактирования ячейки, как сразу я вижу нормально расшифрованное значение.

На данный момент мне не нужно видеть значение зашифрованного поля, т.к. это пароль и пользователю всё равно, что там за звёздочками. Но в другом случае это было бы криво.

Я просто так же (с шифрованием) подключал и работал с компонентами Fib+. В гриде я вижу нормально значение. В базе данных (firebird) зашифрованное значение. Так и должно быть.

Всетаки тяжело понять что вы конкретно хотите реализовать.
Поправьте если я не прав.
1. Вы хотите в файл сохранять зашифрованные значения определенного поля.
2. В гриде вы хотите видеть зашифрованные значения этого поля.
3. При начале редактирования этого поля вы хотите видеть его значение расшифрованным.
4. При применений изменений этого поля вы хотите зашифровать измененное значение.
Автор: X11
Дата сообщения: 18.02.2010 11:02

Цитата:
Всетаки тяжело понять что вы конкретно хотите реализовать.

Что ж тяжелого?
Ввод, изменение пароля с сохранением в текстовый файл с помощью связки dxMemData + cxGrid.


Цитата:
1. Вы хотите в файл сохранять зашифрованные значения определенного поля.

Да


Цитата:
2. В гриде вы хотите видеть зашифрованные значения этого поля.

В данном конкретном случае - это пароль и видеть его не обязательно (будут звёздочки)
А вообще хотелось бы иметь возможно нормально отображать значение поля. Сегодня пароль, а завтра ещё что-нить потребуется.


Цитата:
3. При начале редактирования этого поля вы хотите видеть его значение расшифрованным.

Вообще в гриде по идее должно быть значение видимо в нормальном расшифрованном виде. А тем более в момент редактирования.


Цитата:
4. При применений изменений этого поля вы хотите зашифровать измененное значение.

Да, зашифрованное значение должно хранится в выходном текстовом файле. Пусть даже в самом поле будет незашифрованное значение.
Автор: Cryogen2003
Дата сообщения: 18.02.2010 11:39
vladman
Нашел взаимосвязь некоторую. У меня в моем проекте нормально работает TcxRichEdit (всплывающее меню появляется), но при этом TcxMemo или TcxTextEdit отказываются правильно работать (текст подчеркивается, но всплывающее меню появляется без возможности проверки).
Вот и никак не пойму, что делать то?
Автор: X11
Дата сообщения: 18.02.2010 15:25

Цитата:
X11

Цитата:
Вопрос по сохранению состояния формы. В частности по WindowState. Если окно свернуть и потом закрыть приложение, то после запуска приложения его нет на панели задач.

Попробуйте так

Код:
...
if fmFtpUpdater.WindowState = wsMaximized then
AStoreComponent.Properties.Add('WindowState')
else
begin
AStoreComponent.Properties.Add('top');
AStoreComponent.Properties.Add('left');
AStoreComponent.Properties.Add('height');
AStoreComponent.Properties.Add('width');
end;
cxPropertiesStore1.StoreTo(false);
...


так не получилось из-за того, что у меня одна и та же процедура выполняет и сохранение и восстановление. Отличие лишь в последней строке, которая или сохраняет или восстанавливает настройки.

Я просто добавил в OnCreate
if WindowState = wsMinimized then WindowState := wsNormal;

Наверное это глюк дельфи
Автор: vladman
Дата сообщения: 19.02.2010 01:52
Cryogen2003

Цитата:
Да без проблем могу дать. Сейчас только найду это место. Но факт в том, что раньше работало, а сейчас не работает. Но при этом я ничего не менял
Пример

Пример у меня ваших проблем не показал. Начал разбираться, и только сейчас вспомнил что не обновился до 48 версии. Сейчас 47. На днях поставлю 48 и попробую найти проблему, если еще актуально.

Добавлено:
X11

Цитата:
Что ж тяжелого?

После вашего предпоследнего поста уже ничего, все намного понятнее и, главное, лаконично ).

Цитата:
Я просто так же (с шифрованием) подключал и работал с компонентами Fib+. В гриде я вижу нормально значение. В базе данных (firebird) зашифрованное значение. Так и должно быть.
Думаю, что у девок это баг.

Нет, не баг, и тем более не девок. Дело в том, что метод TdxCustomMemData.SaveToTextFile содержит следующий код

Код: while not EOF do
begin
St := '';
for i := 0 to List.Count - 1 do
begin
if i <> 0 then
St := St + FDelimiterChar;
St := St + TField(List[i]).Text;
end;
Sts.Add(St);
Next;
end;
Автор: Cryogen2003
Дата сообщения: 19.02.2010 08:05
vladman
Вообщем интересную зависимость нашел, но как именно лечить не особо. То есть у меня работает только их Richedit (так, как нужно мне), а все остальные компоненты (от класса TcxCustomEdit) не работают - появляется стандартное меню на редактирование, а при неправильном слове должно появляться меню именно spellchecker.
Заметил еще вот что, что если кидаешь сам компонент spellchecker на свою основную форму, то все работает как надо, но не работает на других формах, которые создаются из основной формы типа так - TMyCustomForm.Create(Nil). И работают как надо, если создавать их так TMyCustomForm.Create(MainForm). Но в любом случае мне так не надо, мне нужно именно через датамодуль. Плюнул я на все это и решил создать компоненты с исправлением этого глюка.

Если вдруг кому интересно будет, то вот тут переписал я уже. [more=Мой модуль]Unit
DevExpressCEB;

Interface

Uses
SysUtils,
Classes,
Controls,
cxControls,
cxContainer,
cxEdit,
cxTextEdit,
cxClasses,
Types,
cxMRUEdit,
cxGridCustomView,
cxGridCustomTableView,
cxGridBandedTableView,
cxMemo;

Type
TcxMemoCEB = Class(TcxMemo)
Private
Procedure EditPopupMenuClick(Sender: TObject);
Protected
Function DoShowPopupMenu(AMenu: TComponent; X, Y: Integer): Boolean;
Override;
Procedure DoContextPopup(MousePos: TPoint; Var Handled: Boolean); Override;
Procedure UpdateEditPopupMenuItems(APopupMenu: TComponent); Virtual;
Function GetEditPopupMenuInstance: TComponent; Virtual;
Procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); Override;
End;

TcxTextEditCEB = Class(TcxTextEdit)
Private
Procedure EditPopupMenuClick(Sender: TObject);
Protected
Function DoShowPopupMenu(AMenu: TComponent; X, Y: Integer): Boolean;
Override;
Procedure DoContextPopup(MousePos: TPoint; Var Handled: Boolean); Override;
Procedure UpdateEditPopupMenuItems(APopupMenu: TComponent); Virtual;
Function GetEditPopupMenuInstance: TComponent; Virtual;
Procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); Override;
End;

TcxMRUEditCEB = Class(TcxMRUEdit)
Private
Procedure EditPopupMenuClick(Sender: TObject);
Protected
Function DoShowPopupMenu(AMenu: TComponent; X, Y: Integer): Boolean;
Override;
Procedure DoContextPopup(MousePos: TPoint; Var Handled: Boolean); Override;
Procedure UpdateEditPopupMenuItems(APopupMenu: TComponent); Virtual;
Function GetEditPopupMenuInstance: TComponent; Virtual;
Procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); Override;
End;

Procedure Register;

Implementation

Uses
Menus;

Procedure Register;
Begin
RegisterComponents('CEB', [TcxMemoCEB, TcxTextEditCEB, TcxMRUEditCEB]);
End;

{ TcxMemoCEB }

Procedure TcxMemoCEB.DoContextPopup(MousePos: TPoint; Var Handled: Boolean);
Var
P: TPoint;
Begin
Inherited;
If Not Handled Then
Begin
If (MousePos.X = -1) And (MousePos.Y = -1) Then
P := ClientToScreen(Point(0, 0))
Else
P := ClientToScreen(MousePos);
Handled := (Assigned(dxISpellChecker) And
dxISpellChecker.QueryPopup(PopupMenu, MousePos)) Or
DoShowPopupMenu(PopupMenu, P.X, P.Y);
End;
End;

Function TcxMemoCEB.DoShowPopupMenu(AMenu: TComponent; X, Y: Integer): Boolean;
Begin
If Assigned(AMenu) Then
Result := Inherited DoShowPopupMenu(AMenu, X, Y)
Else
Begin
UpdateEditPopupMenuItems(GetEditPopupMenuInstance);
Result := Inherited DoShowPopupMenu(GetEditPopupMenuInstance, X, Y);
EditingChanged;
End;
End;

Procedure TcxMemoCEB.EditPopupMenuClick(Sender: TObject);
Begin
//
End;

Function TcxMemoCEB.GetEditPopupMenuInstance: TComponent;

Function NewItem(Const ACaption: String; ATag: Integer): TMenuItem;
Begin
Result := TMenuItem.Create(Self);
With Result Do
Begin
Caption := ACaption;
Tag := ATag;
OnClick := EditPopupMenuClick;
End;
End;

Var
APopupMenu: TPopupMenu;
Begin
If Assigned(PopupMenu) Then
Begin
Result := PopupMenu;
Exit;
End;
APopupMenu := TPopupMenu.Create(Self);
PopupMenu := APopupMenu;

Result := APopupMenu;
End;

Procedure TcxMemoCEB.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
Var
Handled: Boolean;
Begin
If Button <> mbRight Then
Inherited MouseDown(Button, Shift, X, Y)
Else
DoContextPopup(Point(X, Y), Handled);
End;

Procedure TcxMemoCEB.UpdateEditPopupMenuItems(APopupMenu: TComponent);
Begin
If Not (APopupMenu Is TPopupMenu) Then
Exit;
InnerMemo.ReadOnly := Not DataBinding.CanModify Or ActiveProperties.ReadOnly;

InnerMemo.ReadOnly := RealReadOnly;
End;

{ TcxTextEditCEB }

Procedure TcxTextEditCEB.DoContextPopup(MousePos: TPoint; Var Handled: Boolean);
Var
P: TPoint;
Begin
Inherited;
If Not Handled Then
Begin
If (MousePos.X = -1) And (MousePos.Y = -1) Then
P := ClientToScreen(Point(0, 0))
Else
P := ClientToScreen(MousePos);
Handled := (Assigned(dxISpellChecker) And
dxISpellChecker.QueryPopup(PopupMenu, MousePos)) Or
DoShowPopupMenu(PopupMenu, P.X, P.Y);
End;
End;

Function TcxTextEditCEB.DoShowPopupMenu(AMenu: TComponent;
X, Y: Integer): Boolean;
Begin
If Assigned(AMenu) Then
Result := Inherited DoShowPopupMenu(AMenu, X, Y)
Else
Begin
UpdateEditPopupMenuItems(GetEditPopupMenuInstance);
Result := Inherited DoShowPopupMenu(GetEditPopupMenuInstance, X, Y);
EditingChanged;
End;
End;

Procedure TcxTextEditCEB.EditPopupMenuClick(Sender: TObject);
Begin
//
End;

Function TcxTextEditCEB.GetEditPopupMenuInstance: TComponent;

Function NewItem(Const ACaption: String; ATag: Integer): TMenuItem;
Begin
Result := TMenuItem.Create(Self);
With Result Do
Begin
Caption := ACaption;
Tag := ATag;
OnClick := EditPopupMenuClick;
End;
End;

Var
APopupMenu: TPopupMenu;
Begin
If Assigned(PopupMenu) Then
Begin
Result := PopupMenu;
Exit;
End;
APopupMenu := TPopupMenu.Create(Self);
PopupMenu := APopupMenu;

Result := APopupMenu;
End;

Procedure TcxTextEditCEB.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
Var
Handled: Boolean;
Begin
If Button <> mbRight Then
Inherited MouseDown(Button, Shift, X, Y)
Else
DoContextPopup(Point(X, Y), Handled);
End;

Procedure TcxTextEditCEB.UpdateEditPopupMenuItems(APopupMenu: TComponent);
Begin
If Not (APopupMenu Is TPopupMenu) Then
Exit;
InnerTextEdit.ReadOnly := Not DataBinding.CanModify Or
ActiveProperties.ReadOnly;

InnerTextEdit.ReadOnly := RealReadOnly;
End;

{ TcxMRUEditCEB }

Procedure TcxMRUEditCEB.DoContextPopup(MousePos: TPoint; Var Handled: Boolean);
Var
P: TPoint;
Begin
Inherited;
If Not Handled Then
Begin
If (MousePos.X = -1) And (MousePos.Y = -1) Then
P := ClientToScreen(Point(0, 0))
Else
P := ClientToScreen(MousePos);
Handled := (Assigned(dxISpellChecker) And
dxISpellChecker.QueryPopup(PopupMenu, MousePos)) Or
DoShowPopupMenu(PopupMenu, P.X, P.Y);
End;
End;

Function TcxMRUEditCEB.DoShowPopupMenu(AMenu: TComponent;
X, Y: Integer): Boolean;
Begin
If Assigned(AMenu) Then
Result := Inherited DoShowPopupMenu(AMenu, X, Y)
Else
Begin
UpdateEditPopupMenuItems(GetEditPopupMenuInstance);
Result := Inherited DoShowPopupMenu(GetEditPopupMenuInstance, X, Y);
EditingChanged;
End;
End;

Procedure TcxMRUEditCEB.EditPopupMenuClick(Sender: TObject);
Begin
//
End;

Function TcxMRUEditCEB.GetEditPopupMenuInstance: TComponent;

Function NewItem(Const ACaption: String; ATag: Integer): TMenuItem;
Begin
Result := TMenuItem.Create(Self);
With Result Do
Begin
Caption := ACaption;
Tag := ATag;
OnClick := EditPopupMenuClick;
End;
End;

Var
APopupMenu: TPopupMenu;
Begin
If Assigned(PopupMenu) Then
Begin
Result := PopupMenu;
Exit;
End;
APopupMenu := TPopupMenu.Create(Self);
PopupMenu := APopupMenu;

Result := APopupMenu;
End;

Procedure TcxMRUEditCEB.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
Var
Handled: Boolean;
Begin
If Button <> mbRight Then
Inherited MouseDown(Button, Shift, X, Y)
Else
DoContextPopup(Point(X, Y), Handled);
End;

Procedure TcxMRUEditCEB.UpdateEditPopupMenuItems(APopupMenu: TComponent);
Begin
If Not (APopupMenu Is TPopupMenu) Then
Exit;
InnerTextEdit.ReadOnly := Not DataBinding.CanModify Or
ActiveProperties.ReadOnly;

InnerTextEdit.ReadOnly := RealReadOnly;
End;

End.

[/more]

Кстати, так они одну глюку не подправили в модуле cxGridCustomTableView и классе TcxCustomGridTableController, процедура MultiSelectMouseDown.
Проблема в том, что когда на гриде стоит CellMultiSelect = true, то нельзя выбирать записи с помощью Ctrl. Честно говоря хотелось бы как-то этот глюк исправить - или пусть разработчики правят, либо подскажите, как можно заменить эту функцию, но не переписывая исходников разработчиков.
Автор: GladeX
Дата сообщения: 19.02.2010 09:27
По поводу компонента TcxSpreadSheet выяснилось следующее:
Ошибка в Builder C++ 2010 но в BuilderC++ 6.0 ошибки нет при стандартных параметрах..
Похоже это очередной баг 2010... на 2009 не проверял за не имением последнего..
Кстати Builder C++ 2010(Update 4)..
Автор: jonikDk
Дата сообщения: 19.02.2010 11:10
vladman

Цитата:
Это и объясняет то, что вы получали файл с расшифрованными значениями, а также работоспособность решения предложенного jonikDk
Попробуйте, как эксперимент, выполнить tUpdater.SaveToBinaryFile(..) и значения будут зашифрованы.


Добавлено:
X11
Попробуйте этот код, который, как мне кажется, удовлетворяет вашим требованиям и решает нижеследующие проблемы.

добавлю свое имхо... согласен с vladman. Я никогда не пользовался событиями GetText и SetText, предпочитал делать все действия в DataSet, а не у поля, а визуализацию делать gui компонентами. Просто предложил свое решение в лоб, а решение vladman считаю более правильным, но на вкус и цвет ...

Кстати по поводу SaveToBinaryFile, если это так ... то не вижу логику, почему в текстовый файл событие используется, а в binary нет... По моему кто то забыл либо удалить лишние строчки, либо дописать недостающие
Автор: maratea
Дата сообщения: 19.02.2010 12:56
Добрый день.
Подскажите, пожалуйста, как отследить, что в TcxDateEdit дату(время) изменил сам пользователь, а не программно она изменилась.

Событие OnEditValueChange происходит при любом изменении значения, а другог подходящего не вижу =\
Автор: X11
Дата сообщения: 19.02.2010 13:11
В событии непосредственно столбца грида OnEditValueChanged
Автор: maratea
Дата сообщения: 19.02.2010 13:18
какого еще грида?)

TcxDateEdit. Контрол для ввода даты и времени
Автор: afiget
Дата сообщения: 19.02.2010 13:45
maratea
OnEditing ?
Автор: vladman
Дата сообщения: 19.02.2010 15:07
jonikDk

Цитата:
Кстати по поводу SaveToBinaryFile, если это так ... то не вижу логику, почему в текстовый файл событие используется, а в binary нет... По моему кто то забыл либо удалить лишние строчки, либо дописать недостающие

Может руководствовались логикой - в текстовый файл сохраняем то что видим, в бинарный, то что храним. Поля ведь не обязательно все строковые и числовые, могут быть и блобы.

Добавлено:
maratea

Цитата:
Подскажите, пожалуйста, как отследить, что в TcxDateEdit дату(время) изменил сам пользователь, а не программно она изменилась.

Попробуйте обрабатывать событие onValidate. Это событие срабатывает каждый раз, когда происходит преобразование введенного пользователем значения в EditValue.
Автор: Chukotka
Дата сообщения: 20.02.2010 19:01
Такой вопрос: необходимо в TcxTreeList отрисовывать данные в нескольких колонках самому. Решил вопрос применением OnCustomDrawCell на уровне TreeList.
Но решение, имхо, несколько туповатое - для отрисовки мне каждый раз приходится анализировать - тот ли это столбец, не тот.

Теперь вопрос: можно ли решить задачу отрисовки более оптимально, без проверки колонки при каждой отрисовке? Или решение на уровне TreeList - это все, что мы имеем?

Спасибо.
Автор: korobovmax
Дата сообщения: 20.02.2010 19:51
В гриде слева от самого левого столбца можно отображать кнопку с текстом "...". Когда на неё нажимаешь, появляется список столбцов, которые можно скрыть или показать.
Кто-нибудь пробовал сделать в гриде такую кнопку справа (как в мозилла танбербёрд)?
Автор: mdid
Дата сообщения: 21.02.2010 11:17
подскажите плз как убрать все те юниты(dxSkinXmas2008Blue, dxSkinDarkRoom итд) что подключаются когда ложишь на форму TcxGrid(удаляю а они появляются)..для меня они бесполезны а вот проект толстеет непомерно...помню как то убирал а вот как...
Автор: JohnSilver182
Дата сообщения: 21.02.2010 12:59
mdid Project -> Modify Skin Options и там вычисти все .
Потом можно и в USES их мочить .
Автор: mdid
Дата сообщения: 21.02.2010 13:13
спасибо...проект сразу похудел на 10мб в объеме и 40 мб в оперативе...правда я как то не так делал...но пофиг...еще раз спасибо
Автор: korobovmax
Дата сообщения: 21.02.2010 13:35
mdid, смотрите в шапке информацию о том, как иметь скины, но хранить не в exe.
Автор: mdid
Дата сообщения: 21.02.2010 18:07
та мне они вообще не надо...вот вылезла проблемка...запретил там скины..и начал выпадать эксепшн при закрытии приложения
Автор: JohnSilver182
Дата сообщения: 21.02.2010 18:48
mdid
Я эти скины бля..ие пол для вычищал
Автор: afiget
Дата сообщения: 21.02.2010 19:28
А я их просто не ставлю
Автор: volser
Дата сообщения: 21.02.2010 22:54
JohnSilver182
Удалить скины это 10 мин работы, ничего сложного в этом нет. Для этого достаточно переименовать папку где хранятся исходники скинов.
Автор: vladman
Дата сообщения: 21.02.2010 23:46
Chukotka

Цитата:
Но решение, имхо, несколько туповатое - для отрисовки мне каждый раз приходится анализировать - тот ли это столбец, не тот.
Теперь вопрос: можно ли решить задачу отрисовки более оптимально, без проверки колонки при каждой отрисовке? Или решение на уровне TreeList - это все, что мы имеем?

Это и есть самое стандартное и правильно решение если, конечно, правильно понял задачу. А в чем проблема проверки текущего отрисовываемого столбца? Как по мне конструкция *if AViewInfo.Column = <Your>cxTreeListColumn then* не особо и сложная.

Добавлено:
korobovmax

Цитата:
В гриде слева от самого левого столбца можно отображать кнопку с текстом "...". Когда на неё нажимаешь, появляется список столбцов, которые можно скрыть или показать.
Кто-нибудь пробовал сделать в гриде такую кнопку справа (как в мозилла танбербёрд)?

В лоб и сходу такую задачу не решить. Нужно писать своего наследника от TcxCustomGridItemsCustomizationPopup и, потом, соответственно, выше по списку всех классов что его используют. На саппорте народ уже интересовался подобным ItemsCustomizationPopup Placement
Автор: Chukotka
Дата сообщения: 21.02.2010 23:56
vladman

Цитата:
[/q]
[q]Это и есть самое стандартное и правильно решение если, конечно, правильно понял задачу. А в чем проблема проверки текущего отрисовываемого столбца? Как по мне конструкция *if AViewInfo.Column = <Your>cxTreeListColumn then* не особо и сложная.

Так никто не говорит о сложности - речь идет о ресурсозатратности.
Т.е. мне при отрисовке любого столбца надо как минимум выполнить сравнение *if AViewInfo.Column = *

А если учесть, что может быть несколько (много) вариантов отрисовки столбцов, то получается, что мне придется в одном обработчике каждый раз выполнять кучу сравнений...

Если бы было решение на уровне событий колонки, то все решалось бы присваиванием нужного обработчика нужной колонке.
Автор: volser
Дата сообщения: 22.02.2010 00:08
Chukotka

Цитата:
Если бы было решение на уровне событий колонки, то все решалось бы присваиванием нужного обработчика нужной колонке.

Чем это решение лучше предложенного? На каждую колонку сделайте свою процедуру отрисовки и вызывайте ее с общего обработчика.
Автор: Chukotka
Дата сообщения: 22.02.2010 00:17
volser

Цитата:
Чем это решение лучше предложенного? На каждую колонку сделайте свою процедуру отрисовки и вызывайте ее с общего обработчика.

Да, думаю, вариант с внутренним обработчиком ускорит работу. Спасибо.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

Предыдущая тема: Помогите пожалуйста с блокировкой клавиатуры и мышки


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