Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313

Зависает Picture.Create(fname: string)

15.10.2020, 20:26. Показов 1025. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если Picture.Create(fname: string) попробовать открыть файл который злоумышленно испорчен, например взять файл .exe и изменить его разрешение на .png, то "функция" начинает удерживать файл не давая его открыть/стереть/etc.
Мне нужно удалить такой файл прямо из программы.
Следующего вида конструкция не работает.
Pascal
1
2
3
4
Pic0 := Picture.Create(PicFileName); // В этой строке пытаемся считать "испорченный" файл
// Далее к файлу PicFileName невозможно обратится не из программы не из системы. Пишет что файл занят другим процессом.
Assign(ff, PicFileName);
Erase(ff); // Ошибку выдает на этой строке
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2020, 20:26
Ответы с готовыми решениями:

Создать объект типа Picture с использованием картинки из ресурсов / преобразовать тип Image к Picture
Здравствуйте. Нашел пост о том, как добавлять картинки в ресурсы программы,но не смог разобраться в том, как создавать объекты типа Picture...

SET FName = @FName (Собачка)
как попадает из cmd.Parameters.AddWithValue("LName", customersRow); в "SET FName = @FName, ? @FName - это выступает как переменная в...

string, create, checked
хотел бы знать смысл string, create, checked и др. переменных! в каких случаях их применять! кто подскажет? и пожалуйста, если возможно...

11
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
15.10.2020, 20:31
Сразу говорите какой модуль, графических модулей + библиотек много.
0
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
15.10.2020, 20:52  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
Сразу говорите какой модуль, графических модулей + библиотек много.
GraphABC

Добавлено через 1 минуту
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uses GraphABC, System, System.IO;
 
var
  Pic0: Picture;
  ff: file;
  PicFileName: String := 'Sart.png';
 
begin
  while true do
  begin
    try
      Pic0 := Picture.Create('Sart.png'); // В этой строке пытаемся считать "испорченный" файл
      // Далее к файлу PicFileName невозможно обратится не из программы не из системы. Пишет что файл занят другим процессом.
    except
      Assign(ff, 'Sart.png');
      Erase(ff);// Ошибку выдает на этой строке
    end;
  end;
end.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
15.10.2020, 21:48
GraphABC не поддерживается, ему на замену давно пришёл GraphWPF. Поэтому в нём это уже не исправят.

В GraphWPF это тоже сейчас не работает, но насчёт него можно сделать баг репорт, вот такой:
https://github.com/pascalabcne... ssues/2325
0
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
15.10.2020, 22:01  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
GraphABC не поддерживается, ему на замену давно пришёл GraphWPF.
Пока ждал вашего ответа расковыривал GraphWPF, но не нашел в нем конструкции аналогичной
Pascal
1
Pic0 := Picture.Create('Sart.png');
Как я понимаю, в этом модуле картинку с диска можно загрузить только в графическое окно, а мне это по ряду причин не нужно...
но даже если работать с графическим окном, то как вы верно заметили, данный баг присутствует и в этом модуле.

Причем какого то способа его избежать предварительными проверками я не нашел.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
15.10.2020, 22:33
А для чего вам картинка? Если загружать не в графическое окно - надо и использовать не графические модули.
0
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
16.10.2020, 00:27  [ТС]
Вот не поверите, но мне картинка на экране совершенно не нужна. =)
А нужна она "демон процессу" - который скачивает картинку в теневой буфер, обрабатывает как мне необходимо и сохраняет на диск.
При этом я пользуюсь встроенными функциями рисования графических примитивов, масштабированием, попиксельной обработкой и другими плюшками, которые дает графический пакет. Только рисую не в окне, что к слову сказать еще и дополнительное время отъедает, а в "теневом буфере".
При этом мне совершенно не требуется открывать картинку на экране, более того, мне это даже вредно.
Конечно можно включить для графического окна директиву LockDrawing... но лучше бы разработчики дали возможность скрывать Графическое окно, а лучше открывать его отдельной директивой.

Офтоп.
Как по мне, разработчики PascalABC слишком сильно "заориентировальсь" на то, что это пакет для обучения.
Создав действительно замечательный с точки зрения сохранения Паскалевской структуры программы и типизирования данных компилятор - местами он меня просто изумляет и восхищает - тем не менее, очень мало внимания уделяют тому, что на нем можно не только обучаться, но и писать вполне себе масштабные (и даже коммерческие) проекты.
Сильно не хватает нормального Хелпа с нормальными примерами - ей богу, иногда хочется больно треснуть человека, который отвечает за Хелп =)
Не хватает возможности одновременно открыть две Оболочки - одну с основным проектом и параллельно еще одну для микротестирования простого кода.
Беда с сохранением нескольких версий проекта. Точнее вообще ЖОПА, т.к сделать это из-под оболочки вообще никак не выходит.
Ну и еще кучка детских болезней, о которых можно говорить вечно.

И все же, как представитель ольдскульной школы программирования, я ужасно рад, что есть этот проект и что его продолжают поддерживать и обновлять.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
16.10.2020, 08:32
Цитата Сообщение от denismix Посмотреть сообщение
Вот не поверите, но мне картинка на экране совершенно не нужна. =)
А нужна она "демон процессу" - который скачивает картинку в теневой буфер, обрабатывает как мне необходимо и сохраняет на диск.
Это называется фоновый процесс. И обычно такие процессы имеют иконку в трее (среди малюсеньких иконок справа снизу), через которую можно открыть окно чтоб посмотреть статистику / изменить настройки / вырубить фоновую работу. Если, конечно, вы пишете не вирус.

Цитата Сообщение от denismix Посмотреть сообщение
Как по мне, разработчики PascalABC слишком сильно "заориентировальсь" на то, что это пакет для обучения.
А по моему вы слишком заориентировались на использование 1-2 инструментов которые вы встретили в обучающий материалах.
Не привыкайте - для каждой задачи надо знать несколько полностью различных инструментов, чтоб нормально её выполнять.

Графические модули, как я и сказал - заточены под графику в графическом окне.
То что в GraphABC можно было рисовать и на внутренних объектах картинки, это только приятный бонус. В графическом окне от него проку мало, наверное поэтому в GraphWPF такого всё ещё нет.

А изображения можно редактировать вообще не создавая окно, к примеру так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{$reference System.Drawing.dll}
{$apptype windows} // Не создавать консольное окно
 
uses System.Drawing;
 
begin
  var b := new Bitmap('inp.bmp');
  
  var gr := Graphics.FromImage(b);
  var brush := new SolidBrush(Color.Green);
  var pen := new System.Drawing.Pen(Color.Red);
  
  gr.FillEllipse(brush, 10,10,40,30);
  gr.DrawEllipse(pen,   10,10,40,30);
  
  b.Save('otp.bmp');
end.
А создать окно, показываемое только в трее можно так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{$reference System.Windows.Forms.dll}
{$reference System.Drawing.dll}
{$apptype windows}
 
uses System.Windows.Forms;
uses System.Drawing;
 
begin
  var MainForm := new Form;
  
  MainForm.WindowState := FormWindowState.Minimized;
  MainForm.ShowInTaskbar := false;
  
  var exit_btn := new ToolStripButton('Выйти');
  exit_btn.Click += (o,e)->MainForm.Close();
  
  var cms := new ContextMenuStrip;
  cms.Items.Add(exit_btn);
  
  var ni := new NotifyIcon;
  ni.ContextMenuStrip := cms;
  ni.Icon := MainForm.Icon;
  ni.Visible := true;
  ni.Click += (o,e)->
  begin
    MainForm.WindowState := FormWindowState.Normal;
  end;
  
  Application.Run(MainForm);
end.
Цитата Сообщение от denismix Посмотреть сообщение
Беда с сохранением нескольких версий проекта
Для этого есть системы контроля версий. Они, кроме всего прочего, сохраняют не тупо копии всего, а список изменений между контрольными точками (коммитами).
Я сам использую git + поверх него TortoiseGit, чтоб не лезть в консоль для всего.

Цитата Сообщение от denismix Посмотреть сообщение
Сильно не хватает нормального Хелпа с нормальными примерами
Приводите конкретные примеры, что плохо описано. И сразу говорите как по-вашему было бы лучше.
И - вы уже заметили .Net в конце имени этого языка? А точнее справку по этому .Net:
https://docs.microsoft.com/en-... mework-4.8
Кстати, если вы поставите курсор на любое имя и нажмёте F1 - вам откроет страницу справки для этого имени.
Если имя из .Net - справку откроет тоже от .Net'а.

Цитата Сообщение от denismix Посмотреть сообщение
Не хватает возможности одновременно открыть две Оболочки
Да, мне тоже, но не на столько чтоб что-то делать (я вообще не использую проекты для своих больших программ).
Если вы хотите это изменить - вы всегда можете отредактировать Исходных код IDE (редактора) и прислать предложение с вашими изменениями в виде pull request'а. Только приготовьтесь подробно и более-менее официально объяснить что вы изменили и почему вы считаете эти изменения необходимыми.

Добавлено через 7 минут
А, да, и собственно обработка открытия неправильного файла картинки:
Pascal
1
2
3
4
5
6
7
8
9
function LoadBitmap(fname: string): Bitmap;
begin
  var str := System.IO.File.OpenRead(fname);
  try
    Result := new Bitmap(str);
  finally
    str.Close;
  end;
end;
Конструктор Bitmap принимающий строку тоже открывает System.IO.Stream. Но у него str.Close не находится в finally, поэтому при ошибке в чтении потока - поток закроется только при следующей сборке мусора, когда среда выполнения обнаружит что файл оставили открытым, но нигде его уже не используют.
1
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
16.10.2020, 18:13  [ТС]
Спасибо за наводку на System. Жаль, что она совершенно не описана в Хелпе.

Как сделать Хелп лучше - прежде всего ввести в него перекрестные ссылки из разделов и более подробные примеры,
иначе мы видим:
procedure CopyRect(dst: System.Drawing.Rectangle; p: Picture; src: System.Drawing.Rectangle);
Копирует прямоугольник src рисунка p в прямоугольник dst текущего рисунка


Без примера и ссылки на System.Drawing.Rectangle проще один раз загуглить и увидев код в три строки все понять.
Отсюда вопрос - если в Хелпе ничего не понятно, зачем нужен такой Хелп?

Или вот пример - статья for to.
Во всей статье даны примеры только по использованию циклов вида:
Pascal
1
2
for var i := 1 to 10 do
  Print(i);
Что подумает о циклах новичок, который в первый раз их видит? - цикл умеет работать только с одним единственным оператором в теле.
Нужны более широко описывающие суть примеры.

Или вот отрывок статьи:
"С помощью операции new - в стиле C# (предпочтительный).

var p: Person;
p := new Person('Иванов',20);

Деструктор в Object Pascal - специальная процедура, уничтожающая объект и освобождающая динамическую память, которую этот объект занимал. При описании деструктора вместо служебного слова procedure используется служебное слово destructor.

Например:

Pascal
1
2
3
4
destructor Destroy;
begin
  ...
end;
"

Из нее можно сделать следующий вывод: "Чтобы испечь хлеб, нужно испечь хлеб!
Но желательно делать это как делают китайцы в провинции Си-шарп.

Посмотрите наш замечательный рецепт:

Code
1
2
3
4
Хлеб "Хлебный"
Начните готовить хлеб
....
Вы испекли хлеб!
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
16.10.2020, 19:36
Цитата Сообщение от denismix Посмотреть сообщение
Спасибо за наводку на System. Жаль, что она совершенно не описана в Хелпе.
...
Ссыль что я вам скинул - и есть справка. И её так уже открывает кнопка хелпа, то есть F1.

Ещё раз, есть паскаль, а если платформа поверх которой он написан - .Net . То есть данный паскаль включает в себя огромные возможности платформы.
Даже если было бы реально переписать их в справку паскаля - в этом нет смысла, потому что все эти вещи уже и так описаны.

---

Насчёт справки - её исходники находятся в папке рядом с папкой IDE:
https://github.com/pascalabcne... ABCNetHelp

То что вы говорите - выглядит по делу, но всё ещё только придирки, без конкретных примеров исправления.
Лучше всего если вы попробуете в локальной копии репозитория по разному перефразировать и затем пришлёте в качестве пулл-реквеста список предложений.
0
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
17.10.2020, 00:31  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
Ссыль что я вам скинул - и есть справка. И её так уже открывает кнопка хелпа, то есть F1
В описаниях Майкософт все хорошо, только вот примеры там в основном на C# и С++
Переписать их на PascalABC.NET не так то и просто. Более того, из них совершенно не понятен синтаксис применимый к PascalABC и взаимосвязь .NET с объектной моделью PascalABC, а проблемы и ошибки обычно именно в этом.
Что толку, в том, что пользователь PascalABC.NET видит пример на неведомом ему языке программирования, ориентированный на Сишную объектную модель и очень специфические описания и использование типов, да еще с комментариями на английском? Тут уж проще выучить С++ и не заморачиваться =)
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
17.10.2020, 07:47
Цитата Сообщение от denismix Посмотреть сообщение
в основном на C# и С++
Не кидайте всё в 1 кучу. Коды на C# и данном паскале переводятся в обе стороны строчка в строчку с минимальными исправлениями (как присвоение в паскале :=, а в C# =).

А C++ это совершенно другой язык, у него из общего с C# только базовый синтаксис (как то что блоки кода пишуться в { } ).

Цитата Сообщение от denismix Посмотреть сообщение
да еще с комментариями на английском?
А вы хотите учиться программированию по русским текстам?)) Удачи!
Справка по .Net вообще то переведена на русский, там есть кнопка переключения. Но я ни в коем случае не буду рекомендовать этот перевод.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.10.2020, 07:47
Помогаю со студенческими работами здесь

Как запретить заход одного объекта (picture box) на другой picture box
Создаю платформер на Windows Forms, как запретить заход одного picture box'a на другой?

Можно ли динамически создавать Picture Box внутри другого Picture Box?
Можно ли динамически создавать Picture Box внутри другого Picture Box. Если можно то как? Заранее благодарен

Cannot read property 'fName' of undefined
Хочу вывести список пользователей, но когда кручу объект в for loop и записываю в переменную бьет: Cannot read property 'fName' of...

Вписать один Picture control в другой Picture Control на MFC C++
Добрый день, господа! Подскажите пожалуйста как в экранных координатах (проект MFC C++) один Picture Control вписать в другой чтобы меньший...

Зависает string.find
Всем привет! Прошу помощи разобраться с данным кодом: local...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru