자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi 안드로이드 앱에서 사진을 찍어 FPT로 올릴 경우의 문제입니다.
2018.03.22 20:15
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안드로이드 앱에서 사진을 찍어 저장하면 Image에 사진을 보여주고 FPT로 올리게 되면
화면이 검정색으로 되고 앱이 먹통이 됩니다.
그러나 시간이 좀 걸리기는 하지만 FTP에는 화일이름을 지정한대로
사진이 정상적으로 올라가기는 합니다.
아무리 찾아봐도 원인을 알수가 없어 고수님들께 답변을 구합니다~^^
아래는 TakePhotoFromCameraAction(폰에서 사진 촬영해서 폰내에 사진 저장하는 Action)의
OnDidFinishTaking 이벤트 처리 부분 소스입니다.
==============================================================
procedure TForm2.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
var
memStream: TMemoryStream;
begin
Image1.Bitmap.Assign(Image);
memStream := TMemoryStream.Create;
Image1.Bitmap.SaveToStream(memStream);
memStream.position := 0;
IdFTP1.Disconnect;
IdFTP1.Connect;
IdFTP1.Put(memStream, edtJsno1.Text+'_01.jpg', True);
memStream.Free;
pnlTakePhoto.Visible:= False;
end;
===============================================================
댓글 4
-
김원경
2018.03.23 16:03
-
노력짱
2018.03.29 17:09
다른 작업들을 계속 하느라 이제야 확인했습니다.
좋은 답변 진심으로 감사드리며 하나하나 확인해보고
차후 결과가 어떤지는 다시 올리겠습니다~^^
-
지병철
2018.04.03 10:32
여러가지 문제가 있을 수 있을 겁니다.
제가 볼 때는 FTP로 이미지 올리는 동안 Main Process 가 이미지 올리는 일 때문에, 다른 일을 하지 못하기 때문에 발생하는 것이 아닌가 합니다. 애니매이션 을 실행할 때도 비슷한 증상이 나타날 경우가 있습니다.
화면 Display 역할은 Main Process가 하기 때문이겠지요.
이를 회피하기 위해서는 화면 Display를 제외한 나머지 부분을 Thread를 이용하여 처리해야 합니다.
procedure TForm2.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
Image1.Bitmap.Assign(Image);
TThread.CreateAnonymousThread(
procedure
var
memStream: TMemoryStream;
begin
memStream := TMemoryStream.Create;
Image1.Bitmap.SaveToStream(memStream);
memStream.position := 0;
IdFTP1.Disconnect;
IdFTP1.Connect;
IdFTP1.Put(memStream, edtJsno1.Text+'_01.jpg', True);
memStream.Free;
TThread.Synchronize(
procedure
begin
// 화면에 Display를 해야 한다면, 부분에 넣으면 됩니다.
end);
end).Start;
pnlTakePhoto.Visible:= False;
end;
이러할 경우 작업완료 및 에러처리 등에 대한 고민이 생깁니다. Thread 는 Main Process 와 별도로 동작을 할 것이기 때문입니다.
이러할 경우 reference function (Callback function)을 사용하는 것이 좋을 것 같습니다.
type
TCallbackRefFunc = reference to procedure(const aModalResult: TModalResult);
procedure TForm2.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
DoUpload(Image,
procedure (const aModalResult: TModalResult)
begin
if aModalResult = mrOK then
begin
end
pnlTakePhoto.Visible:= False;
ShowMessage('전송성공');
else
begin
ShowMessage('에러발생');
end;
end);
end;
procedure TForm2.DoUpload(aBitmap: TBitmap; aCallbackFunc: TCallbackRefFunc);
begin
TThread.CreateAnonymousThread(
procedure
var
memStream: TMemoryStream;
begin
try
try
memStream := TMemoryStream.Create;
aBitmap.SaveToStream(memStream);
memStream.position := 0;
IdFTP1.Disconnect;
IdFTP1.Connect;
IdFTP1.Put(memStream, edtJsno1.Text+'_01.jpg', True);
if Assigned(aCallbackFunc) then
aCallbackFunc(mrOK);
except
if Assigned(aCallbackFunc) then
aCallbackFunc(mrCancel);
end;
finally
memStream.Free;
IdFTP1.Disconnect;
end;
end).Start;
end;
위의 코드는 테스트 없이 이곳에 바로 작성한 것이라, 에러가 발생할 수 있습니다.
참고하시기 바랍니다.
-
노력짱
2018.04.03 16:52
좋은 답변들 감사드립니다~!!
전에 볼때 IdFTP의 Passive를 비롯한 몇가지 속성을
바꾼다고 바꿔서 해보긴 했었는데
이번에 다시 여러가지 자료도 찾아보고 확인해보다가
Passive 속성이 False로 되어있어 True로 변경해보니
사진을 올린 후에도 문제 없이 정상적으로 넘어가네요.
암튼 해결이 잘 되질않아서 계속 문제가 되었던 부분인데
잘 해결이 되어서 다행이고 올려주신 자료들이
여러가지로 도움이 많이 되었습니다~^^
Delphi 안드로이드 앱에서 사진을 찍어 FPT로 올릴 경우의 문제입니다.
2018.03.22 20:15
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안드로이드 앱에서 사진을 찍어 저장하면 Image에 사진을 보여주고 FPT로 올리게 되면
화면이 검정색으로 되고 앱이 먹통이 됩니다.
그러나 시간이 좀 걸리기는 하지만 FTP에는 화일이름을 지정한대로
사진이 정상적으로 올라가기는 합니다.
아무리 찾아봐도 원인을 알수가 없어 고수님들께 답변을 구합니다~^^
아래는 TakePhotoFromCameraAction(폰에서 사진 촬영해서 폰내에 사진 저장하는 Action)의
OnDidFinishTaking 이벤트 처리 부분 소스입니다.
==============================================================
procedure TForm2.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
var
memStream: TMemoryStream;
begin
Image1.Bitmap.Assign(Image);
memStream := TMemoryStream.Create;
Image1.Bitmap.SaveToStream(memStream);
memStream.position := 0;
IdFTP1.Disconnect;
IdFTP1.Connect;
IdFTP1.Put(memStream, edtJsno1.Text+'_01.jpg', True);
memStream.Free;
pnlTakePhoto.Visible:= False;
end;
===============================================================
댓글 4
-
김원경
2018.03.23 16:03
-
노력짱
2018.03.29 17:09
다른 작업들을 계속 하느라 이제야 확인했습니다.
좋은 답변 진심으로 감사드리며 하나하나 확인해보고
차후 결과가 어떤지는 다시 올리겠습니다~^^
-
지병철
2018.04.03 10:32
여러가지 문제가 있을 수 있을 겁니다.
제가 볼 때는 FTP로 이미지 올리는 동안 Main Process 가 이미지 올리는 일 때문에, 다른 일을 하지 못하기 때문에 발생하는 것이 아닌가 합니다. 애니매이션 을 실행할 때도 비슷한 증상이 나타날 경우가 있습니다.
화면 Display 역할은 Main Process가 하기 때문이겠지요.
이를 회피하기 위해서는 화면 Display를 제외한 나머지 부분을 Thread를 이용하여 처리해야 합니다.
procedure TForm2.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
Image1.Bitmap.Assign(Image);TThread.CreateAnonymousThread(
procedure
var
memStream: TMemoryStream;begin
memStream := TMemoryStream.Create;
Image1.Bitmap.SaveToStream(memStream);
memStream.position := 0;IdFTP1.Disconnect;
IdFTP1.Connect;
IdFTP1.Put(memStream, edtJsno1.Text+'_01.jpg', True);
memStream.Free;TThread.Synchronize(
procedure
begin
// 화면에 Display를 해야 한다면, 부분에 넣으면 됩니다.
end);
end).Start;
pnlTakePhoto.Visible:= False;
end;이러할 경우 작업완료 및 에러처리 등에 대한 고민이 생깁니다. Thread 는 Main Process 와 별도로 동작을 할 것이기 때문입니다.
이러할 경우 reference function (Callback function)을 사용하는 것이 좋을 것 같습니다.
type
TCallbackRefFunc = reference to procedure(const aModalResult: TModalResult);
procedure TForm2.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
beginDoUpload(Image,
procedure (const aModalResult: TModalResult)
begin
if aModalResult = mrOK then
begin
end
pnlTakePhoto.Visible:= False;
ShowMessage('전송성공');
else
begin
ShowMessage('에러발생');
end;
end);
end;
procedure TForm2.DoUpload(aBitmap: TBitmap; aCallbackFunc: TCallbackRefFunc);
begin
TThread.CreateAnonymousThread(
procedure
var
memStream: TMemoryStream;begin
try
try
memStream := TMemoryStream.Create;
aBitmap.SaveToStream(memStream);
memStream.position := 0;IdFTP1.Disconnect;
IdFTP1.Connect;
IdFTP1.Put(memStream, edtJsno1.Text+'_01.jpg', True);if Assigned(aCallbackFunc) then
aCallbackFunc(mrOK);
except
if Assigned(aCallbackFunc) then
aCallbackFunc(mrCancel);
end;
finally
memStream.Free;
IdFTP1.Disconnect;
end;
end).Start;
end;
위의 코드는 테스트 없이 이곳에 바로 작성한 것이라, 에러가 발생할 수 있습니다.
참고하시기 바랍니다.
-
노력짱
2018.04.03 16:52
좋은 답변들 감사드립니다~!!
전에 볼때 IdFTP의 Passive를 비롯한 몇가지 속성을
바꾼다고 바꿔서 해보긴 했었는데
이번에 다시 여러가지 자료도 찾아보고 확인해보다가
Passive 속성이 False로 되어있어 True로 변경해보니
사진을 올린 후에도 문제 없이 정상적으로 넘어가네요.
암튼 해결이 잘 되질않아서 계속 문제가 되었던 부분인데
잘 해결이 되어서 다행이고 올려주신 자료들이
여러가지로 도움이 많이 되었습니다~^^
http://tech.devgear.co.kr/delphi_news/412946
보통 검정화면으로 되는 경우는 위의 주소와 같은 경우입니다. 다시 한 번 확인해 보십시오 특히 옵션 부분 체크가 되어있는지 다시 확인 해보십시오.