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

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

Автор: gyani
Дата сообщения: 20.09.2009 21:06
Да спасибо нашел пример от разработчиков, более сложный но рабочий
Вопрос теперь в другом, я в потоке читаю инет файл и обновляю ProgressBar, но вот когда я пытаюсь обновить значение прогрессбара в гриде выскакивает ошибка(Acess violation at adress ...), подскажите в чем может быть дело?


Код: repeat
Result := Result + Buff;
FillChar(Buff, SizeOf(Buff), 0);
InternetReadFile(FRequest, @Buff, SizeOf(Buff), BytesRead);

Form1.cxProgressBar2.Position:=Form1.cxProgressBar2.Position+BytesRead;..работает

size:=size+BytesRead;
form1.cxGrid4DBTableView1.DataController.SetValue(0,3,size);//выдает ошибку практически в начале цикла


until BytesRead = 0;
Автор: xokc
Дата сообщения: 20.09.2009 22:12

Цитата:
Или придётся отказываться от Layout?

Я бы лучше уж от скинов отказался.
Автор: korobovmax
Дата сообщения: 20.09.2009 23:08
xokc, +1.

---

Скоро выйдут новые лэйауты, просите разработчиков сейчас, пока не поздно.
Автор: Cryogen2003
Дата сообщения: 21.09.2009 09:41
vladman
Точно, так и сделаю. Спс, чего-то сразу не додумал, видимо пятница так действовала
Автор: X11
Дата сообщения: 21.09.2009 13:39

Цитата:
X11

Цитата:
Даже не знаю, в каком направлении копать.

Попробуйте следующее:

Код:
Uses ShellAPI;
function GetFileAssociatedIcon(AFileName: TFileName): HIcon;
var
vBuffer: array[0..2048] of char;
vIconIndex: Word;
begin
StrCopy(@vBuffer, PChar(AFileName));
vIconIndex := 0;
Result := ExtractAssociatedIcon(HInstance, vBuffer, vIconIndex);
end;

procedure <YourForm>.<YourcxGridTableView>CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo:
TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
vIconHandle: HIcon;
begin
if AViewInfo.Item = <YourcxGridTableViewFileImageColumn> then
begin
vIconHandle := GetFileAssociatedIcon(AViewInfo.GridRecord.Values[<YourcxGridTableViewFilePathColumn>.index]);
DrawIcon(ACanvas.Handle, AViewInfo.ClientBounds.Left + 1, AViewInfo.ClientBounds.Top + 1, vIconHandle);
ADone := True;
end;
end;


vladman, я подкорректировал немного твой код, чтобы работал:

Код:
function TfmEmailEdit.GetFileAssociatedIcon(AFileName: String): HIcon;
var
vBuffer: array[0..MAX_PATH] of char;
vIconIndex: Word;
begin
StrCopy(@vBuffer, PChar(AFileName));
vIconIndex := cxSpinEdit1.Value;
Result := ExtractAssociatedIcon(Application.Handle, StrLCopy(vBuffer, PChar(AFileName), SizeOf(vBuffer)-1), vIconIndex);
end;



procedure TfmEmailEdit.dbgMailAttachmentsCustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
Var
val: boolean;
vIconHandle: HIcon;
begin
if (AViewInfo.Item = dbgMailAttachmentsIcon) then
if FileExists(AViewInfo.GridRecord.Values[dbgMailAttachmentsNAME.Index]) then
begin
vIconHandle := GetFileAssociatedIcon(AViewInfo.GridRecord.Values[dbgMailAttachmentsNAME.Index]);
DrawIcon(ACanvas.Handle, AViewInfo.ClientBounds.Left + 1, AViewInfo.ClientBounds.Top + 1, vIconHandle);
ADone := True;
end;
end;
Автор: vladman
Дата сообщения: 21.09.2009 16:32
X11

Цитата:
Пиктограмма выводится в ячейку, но слишком большая, наверное 32х32, а как вывести в ячейку пиктограмму размером 16х16?

Исправьте функцию GetFileAssociatedIcon на следуюущую

Код: function <YourForm>.GetFileAssociatedIcon(AFileName: TFileName): HIcon;
var
vFileInfo : SHFILEINFO;
begin
SHGetFileInfo(PChar(AFileName), 0, vFileInfo, SizeOf(vFileInfo), SHGFI_ICON or SHGFI_SMALLICON);
Result := vFileInfo.hIcon;
end;
Автор: X11
Дата сообщения: 21.09.2009 16:45

Цитата:

Исправьте функцию GetFileAssociatedIcon на следуюущую

Я уже использую эту:

Код:
function TfmEmailEdit.GetRegistryIconHandle(FileName: string): HICON;
var
R: TRegistry;
Alias, //псевдвним для расширения в реестре
IconPath,Ext: string; //путь для файла с иконкой
IconNum, //номер иконки в файле
QPos: Integer; //позиция запятой в записи реестра
begin
IconNum := 0;
Ext:=ExtractFileExt(FileName);
if (Ext='.exe') or (ext='.EXE') then ext:='.com';

R := TRegistry.Create;

try
R.RootKey := HKEY_CLASSES_ROOT;

//чтение псевданима
if R.OpenKey('\' + Ext, True) then
Alias := R.ReadString('');
R.CloseKey;

//чтение записи об иконке
if R.OpenKey('\' + Alias + '\DefaultIcon', True) then
IconPath := R.ReadString('');
R.CloseKey;

//поиск запятой
QPos := Pos(',', IconPath);

//чтение номера иконки в файле если она имеется
if QPos <> 0 then
begin
IconNum := StrToInt(Copy(IconPath, QPos + 1, 4));
IconPath := Copy(IconPath, 1, QPos - 1)
end;

finally
R.Free;
end;

//передача хендлера иконки как результат выполнения
Result := ExtractIcon(hInstance, PChar(IconPath), IconNum);
if result=0 then
Result:=LoadIcon(Hinstance,'NO_FILE');
end;
Автор: vladman
Дата сообщения: 21.09.2009 18:03
X11

Цитата:
Что может быть не так в гриде или в функции GetRegistryIconHandle()?

Это легко проверить, используя функцию получения иконки приведенную мною выше.
Скорее всего проблема именно в функции GetRegistryIconHandle(), которая также может возвращать иконку 32х32.
ЗЫ. На мой взгляд проблема вытаскивая иконок мало относится к теме данного топика.
Автор: Radio_Kat
Дата сообщения: 22.09.2009 06:46
кто-нибуть использовал TcxDBTreeList версии 46 с Firebird ?

у меня возникла проблемма при insert записи, если настроенн generatorField
в прошлой версии ( февральской ) всё работает нормально
с гридом тоже проблемм нет
а при использовании TcxDBTreeList возникает AV

пример проекта вот тут
http://rapidshare.com/files/283297082/sp_av_insert_generatorField.rar.html

может быть конечно зря грешу на devexpress, но там кажется не в чем ошибиться
Автор: volser
Дата сообщения: 22.09.2009 10:59
Radio_Kat
На какой строке падает ошибка?
Автор: Radio_Kat
Дата сообщения: 22.09.2009 11:34
volser, при попытке в новигаторе нажать "+"
первый раз нажимается но нечего не происходит
второй раз: Exception EAccessViolation in module ... at 001D19EC

если обнулить DataSource дерева, то инсерт в грид проходит без ошибок

Код:
if RadioButton1.Checked then
begin
dbtr_spr_mat_.DataController.DataSource := ds_spr_mat;
cxGrid1DBTableView1.DataController.DataSource := nil;
end
else
begin
dbtr_spr_mat_.DataController.DataSource := nil;
cxGrid1DBTableView1.DataController.DataSource := ds_spr_mat;
end
Автор: vladman
Дата сообщения: 22.09.2009 13:29
Radio_Kat

Цитата:
пример проекта вот тут

Выложите скрипт вашей БД, а не сам файл. Или сделайте перемещаемый бекап базы.
Автор: Radio_Kat
Дата сообщения: 22.09.2009 13:42
vladman: скрипт БД

Код:

CREATE GENERATOR GEN_SPR_MAT_ID;

CREATE TABLE SPR_MAT (
ID_MAT INTEGER DEFAULT 0,
NAME VARCHAR(50),
ID_UPPER INTEGER
);


ALTER TABLE SPR_MAT ADD CONSTRAINT UNQ1_SPR_MAT UNIQUE (ID_MAT);

/* Trigger: SPR_MAT_BI */
CREATE OR ALTER TRIGGER SPR_MAT_BI FOR SPR_MAT
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID_MAT IS NULL) THEN
NEW.ID_MAT = GEN_ID(GEN_SPR_MAT_ID,1);
END;

Автор: vladman
Дата сообщения: 22.09.2009 14:04
Radio_Kat
К сожалению сейчас помочь не смогу. У меня, на версии 5.45, ваш пример работает без ошибок.

Добавлено:
Скорее всего, действительно. проблема в версии DevExpress. Но по этому поводу нет никаких сообщений в их Support Center. Хотя, по логике вещей, должны были уже появится, если этот баг действительно присутствует в 46 версии.
Автор: Radio_Kat
Дата сообщения: 23.09.2009 04:55
vladman, я написала в сапорт. если ответят напишу в чем было дело.
Автор: Postscriptum
Дата сообщения: 23.09.2009 15:03
Совсем ламерский вопрос - как узнать порядковый номер строки в девовском DBGride (именно в гриде, а не текущий RecNo от датасета). Чтоб можно было при перемещении по записям видеть текущий номер. Сделал на обработке TableAfterScroll так:

Код:
Stat1.Caption := ' Запись ' + IntToStr(GridDBTableView1.Controller.FocusedRowIndex) + ' из ' + IntToStr(GridDBTableView1.ViewData.RecordCount);
Автор: X11
Дата сообщения: 23.09.2009 16:09
Что значит не всегда правильный? Подробнее. Как это проявляется.
Автор: vladman
Дата сообщения: 23.09.2009 16:11
Postscriptum

Цитата:
как узнать порядковый номер строки в девовском DBGride

Разобраться в тонкостях реализации индексов строк/записей в Controller/DataController поможет отличная статья и пример к ней - Row/record index confusion
Для вашего случая используйте вместо Controller.FocusedRowIndex -> DataController.FocusedRowIndex

Добавлено:
Но! Если у вас возможны группировки в этом View, то нужны дополнительные обработки по вычислению порядкового номера записи, и, более того, этот номер будет зависеть от того как вы захотите нумеровать записи внутри группы: в каждой группе своя нумерация или сквозная нумерация по всем группам.
Автор: Postscriptum
Дата сообщения: 23.09.2009 17:13

Цитата:
Для вашего случая используйте вместо Controller.FocusedRowIndex -> DataController.FocusedRowIndex


Цитата:
Что значит не всегда правильный? Подробнее. Как это проявляется.

Та же песня. Ну вот если я кликаю мышкой на 1 записи - показывает "Запись 0 из 1115", курсором перемещаюсь на строку ниже (2 строка) - опять "Запись 0 из 1115", опять курсором возвращаюсь на 1 строку - уже "Запись 0 из 1115". Если кликнуть, допустим, на 8 строку - пишет "Запись 6 из 1115". Курсором вверх - нормально - "Запись 7 из 1115", опять курсором вниз - "Запись 6 из 1115". Получается - что когда двигаешься курсором вниз - неправильно отображает, курсором вверх - правильно. Или это AfterScroll у Table так отрабатывает непонятно?
Автор: vladman
Дата сообщения: 23.09.2009 19:45
Postscriptum

Цитата:
Или это AfterScroll у Table так отрабатывает непонятно?

Легко проверить. Поставьте ваш код в обработчик onFocusedRecordChanged вашего TableView
Автор: Postscriptum
Дата сообщения: 24.09.2009 00:31
vladman
Точно. Так верно отрабатывает. Спасибо
Автор: Chukotka
Дата сообщения: 24.09.2009 04:32
Создаю простейшее приложение: форма + DockingManager + DockSite.

У DockingManager'a установлены опции doTabContainerCanClose и doFreeOnClose;

В рантайме создаю DockPanel, вот текст процедуры:

Код:
const
Id: integer = 0;
var
Dck: TdxDockPanel;
begin
Dck := TdxDockPanel.Create(Self);
Dck.Name := Format('Name%d', [Id]);
Dck.Caption := Format('Dock panel %d', [Id]);
Inc(Id);
Dck.MakeFloating;
end;
Автор: SIgor33
Дата сообщения: 24.09.2009 10:14
Имеется TcxGridDBCardView у него соотвествено TcxGridDBCardViewRow который представляет собой TcxTextEdit у него использую обработчик PropertiesEditValueChanged
Когда он вызывается я пытаюсь получить вот таким путем значение поля ...FieldByName('Fam').AsString но мне выдает старое значение еще доизменения. Подскажите как получить измененое значение
Автор: f3ka
Дата сообщения: 24.09.2009 10:19
SIgor33
можно попробывать поставить ImmediatePost у редактора
Автор: SIgor33
Дата сообщения: 24.09.2009 10:33
f3ka
Не хотелось бы использовать ImmediatePost так он сразу пытается сделать post для таблицы а нужно оставаться в режиме edit
Автор: f3ka
Дата сообщения: 24.09.2009 10:42
SIgor33
не совсем правильно... попробовать поставить ImmediatePost не у DataController'a, а у конкретного TcxTextEdit...
Автор: SIgor33
Дата сообщения: 24.09.2009 11:02
f3ka
А я что-то не нашел TcxTextEdit свойства ImmediatePost поскажи где рыть
Автор: Radio_Kat
Дата сообщения: 24.09.2009 11:11
пожалуйста, отзовитесь у кого стоит FireBird 2.5 и TcxDBTreeList 5.46

support пишет что не могут повторить ошибку с AV на моем примере из
http://forum.ru-board.com/topic.cgi?forum=33&topic=10123&start=1520#20

хотя у меня она стабильно вылетает
Автор: vladman
Дата сообщения: 24.09.2009 11:16
Radio_Kat
А можно сслыку на ваш пост в суппорте, если не секрет, конечно.
Может дело в компонентах доступа к БД? FireBird 2.5 вторая бета еще по-моему.

Добавлено:
Chukotka

Цитата:
Создаю простейшее приложение: форма + DockingManager + DockSite.


Цитата:
формируется TabContainer в отдельной форме

Не понятно, одна форма или все же их две?
что в операторе Dck := TdxDockPanel.Create(Self); представляет собой Self? Та, отдельная, форма, или какая-то другая? Иными словами в какой форме у вас выполняется код создания DockPanel. Давайте код приложения которое у вас не работает, посмотрим что не так.

Добавлено:
SIgor33

Цитата:
Подскажите как получить измененое значение

Используйте вместо FieldByName('Fam').AsString оператор TcxCustomEdit(Sender).EditingValue
Автор: Chukotka
Дата сообщения: 24.09.2009 12:26
vladman

Цитата:
Не понятно, одна форма или все же их две? Иными словами в какой форме у вас выполняется код создания DockPanel.
В приложении одна форма, она же главная.

Цитата:
что в операторе Dck := TdxDockPanel.Create(Self); представляет собой Self? Та, отдельная, форма, или какая-то другая?
Self - указатель на главную форму. Доп. формы в рантайме образуются после вызова DockPanel.MakeFloating из приведенной в предыдущем посте процедуры.
Т.е. повторю еще раз: одна главная форма, в которой по клику на кнопке идет вызов процедуры с приведенным в предыдущем посте кодом. Формируются FloatForm, из которых вручную перетаскиванием мышкой формируем TabContainer. После этого при попытке закрыть форму с контейнером происходит ошибка.
Источник ошибки тоже указан в предыдущем посте (dxDockControl, процедура DoClose)

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

Предыдущая тема: Delphi: tcp клиент в потоке


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