Перлы в любимых продуктах
или о том, как не надо писать программы27.10.1999 г
Я тут по долгу службы взялся вычищать проекты от следов этой библиотке, попутно накопилось некоторое количество перлов.
- И кто использует этот InfoPower?
- Magic numbers :)
- "Я не знаю про переменную Result"
- Все это переменные, а не функции или свойства
- "Make compiler happy". Бедный компилятор, пытался подсказать дурню
- wwDBEdit.pas
- Такое я глубоко ценю
- Hо лидер, безусловно, ReportBuilder Pro. Оцените :)
- Hет, не могу удержаться - это стоит посмотреть, что бы никогда так не делать. (И никогда не использовать компоненты, написанные так) Продолжаем разбор InfoPower
- Понятно, try..except не для нас - у нас всегда все будет нормально работать. Hо можно лучше - можно скомбинировать с логическими выражениями - будет совсем круто :)
- Вот это case, вот это я понимаю. Ребята уже знают, что такое открытые массивы, но вот про вариантный массив им, беднягам, никто не рассказал:
- "Чуть что - сразу бежать - нам неприятности ни к чему"
- FieldNo - порядковый номер поля. То есть считается, что по 5 полям искать могут только полоумные, а они InfoPower не пользуют
if (parent is TwwCustomDBGrid) and (Parent as TwwCustomDBGrid).editCalculated
then FDataLink.DataSet.Edit
else FDataLink.DataSet.Edit;
procedure TwwSpinButton.AdjustSizes (var W: Integer; var H: Integer);
begin
if (FUpButton = nil) or (csLoading in ComponentState) then Exit;
if W < 15 then W := 15;
function Group: TwwPicResult;
var
Rslt: TwwPicResult;
TermCh: Byte;
begin
TermCh := CalcTerm;
Inc(I);
Rslt := Process(TermCh - 1);
if not IsIncomplete(Rslt) then I := TermCh;
Group := Rslt;
end;
tempStartGroup:= startGroup;
tempEndGroup:= endGroup;
tempStartGroup:= tempStartGroup + 1;
result:= False; { Make compiler happy }
while True do begin
if not GetSubGroup(tempStartGroup, tempEndGroup) then
begin
result:= False;
break;
end
else if (CheckComplete(prIncomplete, tempStartGroup, tempEndGroup)=prAmbiguous) then
begin
result:= True;
break;
end
else begin
tempStartGroup:= tempEndGroup + 2;
if tempStartGroup>endGroup then
begin
result:= False;
break;
end
end
end
procedure Register;
begin
end;
if DefaultButton = dbFindFirst then begin
FirstButton.Default:= True;
NextButton.Default:= False;
end
else begin
FirstButton.Default:= False;
NextButton.Default:= True;
end;
File ppBands:
TppCustomBand = class(TppBand)
function TwwCustomMaskEdit.isValidPictureMask(s: string): boolean;
var pict: TwwPictureValidator;
begin
pict:= TwwPictureValidator.create(FwwPicture.PictureMask,
FwwPicture.AutoFill);;
result := pict.isSyntaxError;
pict.Free;
end;
function TwwCustomMaskEdit.isValidPictureValue(s: string): boolean;
var pict: TwwPictureValidator;
res: TwwPicResult;
begin
if s='' then
result:= True
else if FwwPicture.PictureMask='' then
result:= True
else begin
pict:= TwwPictureValidator.create(FwwPicture.PictureMask,FwwPicture.AutoFill);;
res:= Pict.picture(s, False);
result := res = prComplete;
pict.Free;
end;
DoOnCheckValue(result);
end;
Function wwDoLookupTable(ALookupTable : TTable; DataSet: TDataset; links: TStrings) : boolean;
var res: boolean;
lookupTable: TwwTable;
begin
res:= False;
lookupTable:= AlookupTable as TwwTable;
{skip - IA}
case (links.count) of
2: res:= lookupTable.wwFindKey([FieldByName(links[0]).asString]);
4: res:= lookupTable.wwFindKey([FieldByName(links[0]).asString,FieldByName(links[2]).asString] );
6: res:= lookupTable.wwFindKey([FieldByName(links[0]).asString,FieldByName(links[2]).asString, FieldByName(links[4]).asString] );
8: res:= lookupTable.wwFindKey([FieldByName(links[0]).asString, FieldByName(links[2]).asString, FieldByName(links[4]).asString, FieldByName(links[6]).asString] );
10: res:= lookupTable.wwFindKey([FieldByName(links[0]).asString, FieldByName(links[2]).asString, FieldByName(links[4]).asString, FieldByName(links[6]).asstring, FieldByName(links[8]).asString] );
12: res:= lookupTable.wwFindKey([FieldByName(links[0]).asString, FieldByName(links[2]).asString, FieldByName(links[4]).asString, FieldByName(links[6]).asstring, FieldByName(links[8]).asstring, FieldByName(links[10]).asString] );
else;
end;
end;
result:= res;
end;
Function wwIsValidValue(FldType: TFieldType; key: string):boolean;
begin
result:= False;
case FldType of
ftCurrency, ftFloat, ftBCD : if not wwStrToFloat(key) then exit;
ftinteger, ftSmallInt, ftWord : if not wwStrToInt(key) then exit;
{$ifdef win32}
ftAutoInc : if not wwStrToInt(key) then exit;
{$endif}
ftTime: if not wwStrToTime(key) then exit; {3/6/97}
ftDate : if not wwStrToDate(key) then exit;
ftDateTime :
if not wwStrToDateTime(key) then begin
if not wwStrToDate(key) then exit;
end;
else;
end;
result:= True;
end;
Function wwTableFindNearest(dataSet: TDataSet; key: string; FieldNo:
integer): boolean;
{skip - IA}
else begin
case FieldNo of { 6/20/98 - Use AsString insted of Text }
0: FindNearest([key]);
1: FindNearest([indexFields[0].asString, key]);
2: FindNearest([indexFields[0].asString, indexFields[1].asString, key]);
3: FindNearest([indexFields[0].asString, indexFields[1].asString, indexFields[2].asString, key]);
end
Если у кого есть подобные перлы, пришлите, пожалуйста. Будут пожелания, можно устраивать показательные разборки чужого кода :)
Автор: Ilya Andreev AKA Andre
Оформление: Delphi Plus
| 2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2002 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2001 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2000 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 1999 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
Последние статьи
- Компания по разработке программного обеспечения
- Услуги аутсорсинга в области программирования
- Как продлить срок службы картриджей
- Мошенничество во Всемирной Паутине. Осторожно: фишинг!
- Web-студия
- Как легально поднять уровень индекса цитирования.
- Мы реально сможем помочь вам в управлении предприятием
- Создание сайтов – популяризация вашего замысла
- Свой сайт. Управление ресурсом
- Семантическое ядро сайта или правила подбора ключевых фраз
Литература
- Программирование в среде Delphi 8 for .NET
- Практикум по Delphi для решения прикладных задач
- Фундаментальные алгоритмы и структуры данных в Delphi
- Delphi 6. Программирование на Object Pascal
- Delphi и технология COM
- Delphi в шутку и всерьез: что умеют хакеры
- Программирование в Delphi глазами хакера
- Delphi 2005. Секреты программирования
- Искусство создания компонентов Delphi
- Приемы программирования в Delphi на основе VCL
- Программирование баз данных в Delphi 7
- Программирование баз данных в Delphi
- Программирование в среде Delphi
- Программирование в Delphi 7
- Язык SQL в Delphi 5