Форум: "Прочее";
Текущий архив: 2009.02.08;
Скачать: [xml.tar.bz2];
ВнизКачество кода VCL Найти похожие ветки
← →
atruhin © (2008-12-10 15:51) [0]Понадобился класс, поддержки динамического массива (вставка сортировка и т.д.)
В итоге нашел в стандартной поставке Delphi 2007 модуль Mxarrays, обрадовался.
Создаю экземпляр массива, получаю исключение. Начинаю смотреть, в модуле
используются переменные менеджера памяти, которые помеченны в System
как Unsupported.
AllocMemCount: Integer deprecated; {Unsupported}
AllocMemSize: Integer deprecated; {Unsupported}
Ладно, убираю их использование, валится следующая ошибка, не зависящая от первой.
Вот тут и возник вопрос:
я понимаю ошибки возникающие, при каких то редких условиях, но когда ПОЛНОСТЬЮ
не рабочий модуль... Неужели перед поставкой трудно провести обычное авто-тестирование
тем же DUnit? А потом обсуждают почему Delphi популярность теряет.
PS. Понимаю что тема холиварная, но полдня править/тестировать, дебильные ошибки,
в стандартном модуле, наболело.
← →
Rouse_ © (2008-12-10 16:23) [1]
> Понимаю что тема холиварная, но полдня править/тестировать,
> дебильные ошибки,
> в стандартном модуле, наболело.
Не нужно искать ошибки там где их нет, нужно учиться программировать:program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils,
Mxarrays in "Mxarrays.pas";
function CompareProc(var item1, item2: Integer): Integer;
begin
if item1 > item2 then
Result := 1
else
if item1 >= item2 then
Result := 0
else
Result := -1;
end;
var
A: TIntArray;
I: Integer;
begin
try
Randomize;
SetMemoryCapacity(20 * SizeOf(Integer));
A := TIntArray.Create(0, SizeOf(Integer));
try
A.CompareProc := @CompareProc;
A.SortOrder := tsAscending;
// Заполнение массива данными
for I := 0 to 9 do
A.Add(Random(MaxInt));
// Вывод содержимого массива на экран
Writeln("Start Array:");
for I := 0 to A.Count - 1 do
Writeln(I, ": ", A[I]);
// Удаление из массива нечетных элементов
for I := 9 downto 0 do
if A[I] mod 2 = 1 then
A.Delete(I);
Writeln;
Writeln("Array after delete:");
// Вывод содержимого массива на экран
for I := 0 to A.Count - 1 do
Writeln(I, ": ", A[I]);
// Добавление в конец массива сумм пар элементов
A.SortOrder := tsNone;
for I := 0 to A.Count - 2 do
A.Add(A[I] + A[I + 1]);
Writeln;
Writeln("Array with summ:");
// Вывод содержимого массива на экран
for I := 0 to A.Count - 1 do
Writeln(I, ": ", A[I]);
Readln;
finally
A.Free;
end;
except
on E:Exception do
Writeln(E.Classname, ": ", E.Message);
end;
end.
← →
atruhin © (2008-12-10 17:10) [2]Нда уж, признаю, лопухнулся. В хелпе как обычно, ни строчки, а сам не понял сакрально смысла.
Тогда может вот это поведение объяснишь:
program Project111;
{$APPTYPE CONSOLE}
uses
SysUtils,
Mxarrays in "C:\Users\A.Truhin\Documents\RAD Studio\Projects\Mxarrays.pas";
var
IA : TCustomArray;
begin
try
SetMemoryCapacity(400 * SizeOf(Integer));
IA := TCustomArray.Create(0, varInteger);
IA.Add(10);
IA.Add(20);
IA.Items[1] := 30;
Writeln(IA.MemberCount);
IA.Free;
IA := TCustomArray.Create(0, varString);
IA.Add("10");
IA.Add("20");
IA.Items[1] := "30";
Writeln(IA.MemberCount);
IA.Free;
Readln;
except
on E:Exception do
Writeln(E.Classname, ": ", E.Message);
end;
end.
Выводит 2-3
← →
Riply © (2008-12-10 17:14) [3]> [0] atruhin © (10.12.08 15:51)
> но полдня править/тестировать, дебильные ошибки,
> в стандартном модуле, наболело.
А можно список "стандартных модулей и дебильных ошибкок",
которые ты в них исправил ?
← →
jack128_ (2008-12-10 17:17) [4]
> А можно список "стандартных модулей и дебильных ошибкок",
>
> которые ты в них исправил ?
Ужастиков посмотреть захотелось?? :-D
← →
Rouse_ © (2008-12-10 17:25) [5]
> Тогда может вот это поведение объяснишь:
Легко, достаточно посмотреть исходник.
В TCustomArray.SetItem обработчик varInteger выглядит какTIntArray(FArray)[Index] := Value;
а обработчик varStringTStringArray(FArray).Insert(Index, Value);
Отсюда и увеличение размера.
← →
Riply © (2008-12-10 17:32) [6]> [4] jack128_ (10.12.08 17:17)
> Ужастиков посмотреть захотелось?? :-D
Да уж. Спросила, не подумав о последствиях. Вопрос снимается :)
← →
atruhin © (2008-12-10 17:52) [7]> [3] Riply © (10.12.08 17:14)
Например проблемма с Anchors в MDI формах, танется через много версий,
или выполни код из [2], и докажи что это нормально поведение.
← →
Илья Корстин © (2008-12-10 17:58) [8]
> Например проблемма с Anchors в MDI формах
Какая проблема?
← →
Rouse_ © (2008-12-10 17:59) [9]
> А можно список "стандартных модулей и дебильных ошибкок",
> которые ты в них исправил ?
В действительности таких предостаточно и иногда к сожалению приходится править "генофонд", например мне пришлось переписать большинство элементов из ComCtrls (HeaderControl, SysTreeView32, SysListView32 etc) для того чтобы они хотябы поддерживали нормально тот функционал который за ними закреплен в MSDN, ибо меня не устраивает куцость текущей их VCL реализации, а из явно ошибочных также предостаточно.
Например пресловутый TCustomComboBoxEx от которого нельзя сделать по нормальному наследника с расширением функциональности итемов. У них эта функциональность заложена, есть метод
function GetItemsClass: TCustomComboBoxStringsClass; override;
но толку от него, если в конструкторе написано:
Items := TComboBoxExStrings.Create(Self);
Эта ошибка уже непомню сколько лет тянется, описана на кодецентрале и все еще не пофиксена... Ну и много чего еще, вспоминать лениво...
← →
Rouse_ © (2008-12-10 18:02) [10]
> или выполни код из [2], и докажи что это нормально поведение.
Это абсолютно нормальное поведение, причем которое абсолютно спокойно читается по исходному коду. Я не нашел там каких либо неожиданностей.
Если хочешь работать непосредственно с TStringArray и иметь то поведение которое тебе надобно, так и используй его напрямую, зачем долбиться к его методам через промежуточную обертку?
← →
atruhin © (2008-12-10 18:03) [11]> [8] Илья Корстин © (10.12.08 17:58)
Лень расписывать, набери в google : delphi Anchors MDI
будет куча ссылок с описанием и попытками обхода.
← →
atruhin © (2008-12-10 18:05) [12]> [10] Rouse_ © (10.12.08 18:02)
> Это абсолютно нормальное поведение,
Как это нормальное? если вызов одного и того же метода приводит к разным результатам,
в зависимости от хранимых данных?
← →
Rouse_ © (2008-12-10 18:15) [13]
> Как это нормальное? если вызов одного и того же метода приводит
> к разным результатам,
> в зависимости от хранимых данных?
Еще раз повторяю - в исходниках все это хорошо читается.
То что нет документации в которой описывалось такое поведение - это плохо, с другой стороны, есть множество функций в которых поведение с одним параметром отличатся от поведения с абсолютно другим параметром, например NtQuerySystemInformation с флагом SystemProcessesAndThreadsInformation вернет размер требуемого буффера, в отличие от флага SystemHandleInformation - где эта функция будет выдавать ошибку до тех пор, пока ты не передаш ей буффер желаемого размера...
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.02.08;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c