Нет, ребята, все не так. Как обратится к мемо.
Нет, ребята, все не так. Как вы помните стояла задача сделать что-то типа защиты от несанкционированного использования. В отчете из одной страницы был адрес организации. Как сделать так чтобы он всегда печатался той организации которой я продал программу? При этом клиент мог изменять отчет, подгонять его под принтер и т.п. А вот так:
var
mv : TfrMemoView;
begin
with Report1 do begin
if not LoadFromFile('AktDual1.frf') then begin
ShowMessage('Не могу загрузить файл отчета: '+'AktDual1.frf');
Exit;
end;//if not LoadFromFile
PrepareReport;
EMFPages.ObjectsToPage(0);
gbOKPass := False;
for i := 0 to Pages.Pages[0].Objects.Count - 1 do begin
mv := Pages.Pages[0].Objects.Items;
if (mv.Name = 'meAdrZ_1') then begin //ищем мемо с моим названием
if mv.BandAlign = 4 then begin // проверяем его месторасположение, размеры, шрифт
if mv.dy >= 14 then begin
if mv.Font.Size in [7..11] then begin
if mv.x in [10..200] then begin
if mv.y in [10..100] then begin
if pos(TestAddr,Addr) > 0 then begin// есть ли в адресе правильный адрес?
gbOKPass := True;
Pages.Pages[0].Objects.Delete(i);// уничтожаем этот объект
mv.FillColor := clWhite;// делаем его не прозрачным
mv.Memo.Text := Addr;// пишем правильный адрес
mv.gapx := 2; // устанавливаем для него правильное расположение в рамке
mv.gapy := 0;
EMFPages.Pages[0].Page.Objects.Add(mv);
{ добавляем на старое место, т.к. они могли бы поверх моего адреса
создать свой мемо и закрасить его и мой адрес хоть и присутствует, а не печатался бы
}
EMFPages.PageToObjects(0);
Break;// выходим из цикла
end;
end;
end;
end;
end;
end;
end;
end;//for
if gbOKPass then begin
if gbPrintPreview then ShowPreparedReport
else begin
PrintPreparedReport('', 1, True, frAll);
end;
end else begin
ShowMessage('Это лицензионная копия программы?');
exit;
end;
end;//with
end;
У кого есть замечания?
var
mv : TfrMemoView;
begin
with Report1 do begin
if not LoadFromFile('AktDual1.frf') then begin
ShowMessage('Не могу загрузить файл отчета: '+'AktDual1.frf');
Exit;
end;//if not LoadFromFile
PrepareReport;
EMFPages.ObjectsToPage(0);
gbOKPass := False;
for i := 0 to Pages.Pages[0].Objects.Count - 1 do begin
mv := Pages.Pages[0].Objects.Items;
if (mv.Name = 'meAdrZ_1') then begin //ищем мемо с моим названием
if mv.BandAlign = 4 then begin // проверяем его месторасположение, размеры, шрифт
if mv.dy >= 14 then begin
if mv.Font.Size in [7..11] then begin
if mv.x in [10..200] then begin
if mv.y in [10..100] then begin
if pos(TestAddr,Addr) > 0 then begin// есть ли в адресе правильный адрес?
gbOKPass := True;
Pages.Pages[0].Objects.Delete(i);// уничтожаем этот объект
mv.FillColor := clWhite;// делаем его не прозрачным
mv.Memo.Text := Addr;// пишем правильный адрес
mv.gapx := 2; // устанавливаем для него правильное расположение в рамке
mv.gapy := 0;
EMFPages.Pages[0].Page.Objects.Add(mv);
{ добавляем на старое место, т.к. они могли бы поверх моего адреса
создать свой мемо и закрасить его и мой адрес хоть и присутствует, а не печатался бы
}
EMFPages.PageToObjects(0);
Break;// выходим из цикла
end;
end;
end;
end;
end;
end;
end;
end;//for
if gbOKPass then begin
if gbPrintPreview then ShowPreparedReport
else begin
PrintPreparedReport('', 1, True, frAll);
end;
end else begin
ShowMessage('Это лицензионная копия программы?');
exit;
end;
end;//with
end;
У кого есть замечания?
Комментарии
хоть шифруй, хоть пакуй.
Найдите еще два необходимых дополнения для 100% защиты отчета (или три).
Для "продвинутых пользователей": нет проверки что над твоей мемой нету объекта, который полностью перекрывает твою писанину и выводит нужный текст )
Объект который перекрывает перекрывается Add(mv) - это ты проглядел.
И еще скрипт надо порубить:
mv.Script.Clear;
Так что ты - молодец.
Я могу привести МАССУ способов как обойти твою "защиту" - вот самый простой на мой вгляд:
Сам документ формируется на второй странице, а первую делают так, чтобы в идеале она была совершенно пустая.
Ну теперь нетрудно понять что происходит при печати - первый лист просто выкидывается (либо используется повторно ))
добавляем:
if Pages.Count > 1 then exit;
Ну больше я способов и не вижу...
Я делаю PrepareReport
и не печатаю и нет предварительного просмотра. Надо ли как-то освобожать память? В Хелпе не сказано ничего. А если сделать Free, то следующие отчеты падают с Аксес Виолейшен.
Не понял из какого места EXIT ?
PrepareReport;
if Pages.Count > 1 then exit;
можно и во внуть if-оф засунуть
if Pages.Count = 1 then begin
это уже не принципиально.
Т.е. ты своим клиентом говоришь прямо - документ может быть ТОЛЬКО на одной странице, т.к. я забочусь о защите ПО от нелегального использования ???
На месте клиентов я бы начал искать другого разработчика )