|
 |
aspx thread: Image Generation Sample...
Message #1 by =?iso-8859-1?Q?Fredrik_Norm=E9n?= <fredrik.normen@e...> on Wed, 11 Oct 2000 10:15:32 +0200
|
|
This is a multi-part message in MIME format.
------=_NextPart_000_0047_01C03369.DA5CA060
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Here is something for you..
/Fredrik Normen
From: Scott Guthrie
One of the neat new features of ASP+ that I haven't seen anyone take
advantage of yet is the ability to dynamically generate images on the fly.
Attached is a sample that should allow you to easily experiment with this.
I say "should" since I haven't tested the latest copy of it with the
prerelease bits (I have beta1 on my machine right now). If there are some
compile issues, I'm hoping someone can help me out with fixing up the
problems and reposting the sample.
The sample I have today is basically a "stock picker" page
(stockpicker.aspx") that enables a user to select one of two stocks (msft
and sun), and then click "show chart". This causes a request to
"ImageGenerator_Vb.aspx" -- which is the page that dynamically generates a
.jpg on the server plotting the stock price of the selected stock, and then
draws a nice line chart of the data.
A couple of notes about this sample:
1) Most of the actual image chart generation code is encapsulated within the
"ChartEngine.cs" component. To compile this component, create a "bin"
directory underneath your application and run the attached "mk.bat" batch
file.
2) The "ChartEngine.cs" file is a generic chart generation component. There
is nothing specific about stocks built into it. Alternatively, you could
use the exact same component to chart anything you want (example: number of
people on this listserv over time, etc).
2) The ImageGenerator_VB.aspx page uses a <%@ Page ContentType="image/jpeg"
%> attribute to tell ASP+ to set the return mime type of the content as a
jpeg
3) The ImageGenerator_VB.aspx page could have optionally used an <%@
OutputCache Duration="60" %> directive to tell ASP+ to dynamically
outputcache the results of the image generation. This is recommended in
cases where you can cache the image -- as it will significantly reduce the
load on your system.
4) There are no license issues with using System.Drawing (which is how
ChartEngine.cs was implemented). Feel free to dynamically generate images
to your hearts content.
<<mk.bat>> <<StockPicker.aspx>> <<ImageGenerator_Vb.aspx>>
<<ChartEngine.cs>>
To run the sample, first create a "bin" directory underneath your
application, run the "mk.bat" file, then hit the stockpicker.aspx page.
Thanks,
Scott
------=_NextPart_000_0047_01C03369.DA5CA060
Content-Type: application/octet-stream;
name="mk.bat"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="mk.bat"
csc /t:library /debug+ /out:bin\chartgen.dll ChartEngine.cs
/r:System.Web.dll /r:System.Winforms.dll /r:System.Drawing.dll
/r:System.dll
------=_NextPart_000_0047_01C03369.DA5CA060
Content-Type: application/octet-stream;
name="StockPicker.aspx"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="StockPicker.aspx"
<script language=3D"C#" runat=3Dserver>
void ChartBtn_Click(Object sender, EventArgs e) {
chart.ImageUrl =3D "ImageGenerator_Vb.aspx?";
chart.Visible =3D true;
foreach(ListItem item in Stocks.Items) {
if (item.Selected =3D=3D true) {
chart.ImageUrl +=3D "symbols=3D" + item.Value + "&";
}
}
}
</script>
<html>
<body>
<form runat=3Dserver>
<h1>Scott's Stock Picker</h1>
<asp:checkboxlist id=3D"Stocks" runat=3Dserver>
<asp:listitem>MSFT</asp:listitem>
<asp:listitem>Sun</asp:listitem>
</asp:checkboxlist>
<asp:button text=3D"Chart Your Selected Stocks"
OnClick=3D"ChartBtn_Click" runat=3Dserver/>
<hr>
<asp:Image id=3D"chart" ImageUrl=3D"" Visible=3Dfalse
runat=3Dserver/>
</form>
</body>
</html>
------=_NextPart_000_0047_01C03369.DA5CA060
Content-Type: application/octet-stream;
name="ImageGenerator_Vb.aspx"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="ImageGenerator_Vb.aspx"
<%@ Page Language=3D"VB" ContentType=3D"image/jpeg" %>
<%@ Import Namespace=3D"System.Drawing" %>
<%@ Import Namespace=3D"System.Drawing.Drawing2D" %>
<%@ Import Namespace=3D"System.Drawing.Imaging" %>
<%@ Import Namespace=3D"ChartGenerator" %>
<script language=3D"VB" runat=3Dserver>
Function GetStockDetails(Symbol as String) as ChartLine
Dim myChartLine as new ChartLine
if (symbol =3D "msft") then
Dim StockValues() as Single =3D { 60, 110, 120, 180, 185,
190, 240, 290 }
myChartLine.Width =3D 5
myChartLine.Color =3D Color.White
myChartLine.LineStyle =3D DashStyle.Solid
myChartLine.Title =3D "Microsoft Corp. (MSFT)"
myChartLine.Symbol =3D "MSFT"
myChartLine.Values =3D StockValues
return myChartLine
elseif (symbol =3D "sun") then
Dim StockValues() as Single =3D { 180, 155, 125, 60, 25, 15,
10, 3 }
myChartLine.Width =3D 5
myChartLine.Color =3D Color.Red
myChartLine.LineStyle =3D DashStyle.Dot
myChartLine.Title =3D "Sun Corp. (Sun)"
myChartLine.Symbol =3D "Sun"
myChartLine.Values =3D StockValues
return myChartLine
end if
return nothing
End Function
Sub Page_Load(Sender as Object, E as EventArgs)
' Generate Chart Data For Image....
Dim XAxes() as String =3D { "9:00AM", "9:30AM", "10:00AM",
"11:00AM", "12:00AM", "1:00PM", "1:30PM" }
Dim MyChartData as New ChartData
MyChartData.YTickSize =3D 20
MyChartData.YMax =3D 250
MyChartData.YMin =3D 0
MyChartData.XAxisTitles =3D XAxes
Dim Symbols() as String =3D
Request.QueryString.GetValues("symbols")
if (Symbols <> nothing) then
for i=3D0 to Symbols.Length-1
Dim stockValue as ChartLine =3D
GetStockDetails(symbols(i).ToLower)
if (stockValue <> nothing) then
myChartData.Lines.Add(stockValue)
end if
Next
end if
' Create In-Memory BitMap of JPEG
Dim MyChartEngine as New ChartEngine
Dim StockBitMap as BitMap =3D MyChartEngine.DrawChart(600, 400,
myChartData)
' Render BitMap Stream Back To Client
StockBitMap.Save(Response.OutputStream, ImageFormat.JPEG)
End Sub
</script>
------=_NextPart_000_0047_01C03369.DA5CA060
Content-Type: application/octet-stream;
name="ChartEngine.cs"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="ChartEngine.cs"
using System.WinForms;
using System.Collections;
using System.Collections.Bases;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.ComponentModel;
using System;
using System.IO;
namespace ChartGenerator {
//Core Line Data structure
public struct LineData {
public float[] LineValues ;
public string LineTitle ;
public string LineSymbol ;
}
//Line Data plus display style information
public class ChartLine {
private Color lineColor ;
private LineData lineData ;
private DashStyle lineStyle ;
private int lineWidth ;
//Constructors
public ChartLine() :base() {}
public ChartLine(LineData lineData) :base() {
this.lineData =3D lineData;
}
//Properties
public Color Color {
get { return lineColor ; }
set { lineColor =3D value ; }
}
public DashStyle LineStyle {
get { return lineStyle ; }
set { lineStyle =3D value ; }
}
public string Symbol {
get { return lineData.LineSymbol ; }
set { lineData.LineSymbol =3D value ; }
}
public string Title {
get { return lineData.LineTitle ; }
set { lineData.LineTitle =3D value ; }
}
public float[] Values {
get { return lineData.LineValues ; }
set { lineData.LineValues =3D value ; }
}
public int Width {
get { return lineWidth ; }
set { lineWidth =3D value ; }
}
//Methods
public void SetLineData(LineData lineData) {
this.lineData =3D lineData;
}
}
//Chart Data structure
public class ChartData {
private float yTickSize;
private float yMax;
private float yMin;
private string[] xAxisTitles ;
private ChartLineList lines =3D new ChartLineList();
private Color gridColor=3DColor.Blue;
private bool showHGridLines=3Dtrue;
private bool showVGridLines=3Dtrue;
//Properties
public float YTickSize {
get { return yTickSize ; }
set { yTickSize =3D value ; }
}
public float YMax {
get { return yMax ; }
set { yMax =3D value ; }
}
public float YMin {
get { return yMin ; }
set { yMin =3D value ; }
}
public string[] XAxisTitles {
get { return xAxisTitles ; }
set { xAxisTitles =3D value ; }
}
public ChartLineList Lines {
get { return lines ; }
set { lines =3D value ; }
}
public Color GridColor {
get { return gridColor ; }
set { gridColor =3D value ; }
}
public bool ShowHGridLines {
get { return showHGridLines ; }
set { showHGridLines =3D value ; }
}
public bool ShowVGridLines {
get { return showVGridLines ; }
set { showVGridLines =3D value ; }
}
//Collection of Chart Lines
public class ChartLineList : TypedCollectionBase {
public ChartLine this[int index] {
get {
return (ChartLine)(List[index]);
}
set {
List[index] =3D value;
}
}
public int Add(ChartLine value) {
return List.Add(value);
}
public void Insert(int index, ChartLine value) {
List.Insert(index, value);
}
public int IndexOf(ChartLine value) {
return List.IndexOf(value);
}
public bool Contains(ChartLine value) {
return List.Contains(value);
}
public void Remove(ChartLine value) {
List.Remove(value);
}
public void CopyTo(ChartLine[] array, int index) {
List.CopyTo(array, index);
}
}
}
//Charting Engine - draws a chart based on the given ChartData
public class ChartEngine {
private ChartData chartData ;
private float left;
private float right;
private float top;
private float bottom;
private float tickCount;
private float yCount;
private float hspacing;
private float vspacing;
private Graphics g;
private Rectangle r;
private Color backColor;
private Color foreColor;
private Font baseFont;
private Font legendFont;
private RectangleF legendRect;
public ChartEngine() {
}
public Bitmap DrawChart(int width, int height, ChartData
chartData) {
Bitmap newBitmap =3D new
Bitmap(width,height,PixelFormat.Format32bppARGB);
Graphics g =3D Graphics.FromImage(newBitmap);
Rectangle r =3D new Rectangle(0, 0, width, height);
Color myForeColor =3D Color.Black;
Color myBackColor =3D Color.White;
Font myFont =3D new Font("Arial", 10);
this.DrawChart(g, r, myBackColor, myForeColor, myFont,
chartData);
return newBitmap;
}
public void DrawChart(Graphics g, Rectangle r, Color backColor,
Color foreColor, Font baseFont, ChartData chartData) {
this.chartData =3D chartData;
this.g =3D g;
this.r =3D r;
this.backColor =3D backColor;
this.foreColor =3D foreColor;
this.baseFont =3D baseFont;
this.legendFont =3D new Font(baseFont.FontFamily,
(baseFont.Size * 2/3), baseFont.Style | FontStyle.Bold);
g.SmoothingMode =3D SmoothingMode.AntiAlias;
CalculateChartDimensions();
DrawBackground();
InternalDrawChart() ;
}
private void CalculateChartDimensions() {
right =3D r.Width - 5;
top =3D 5 * baseFont.Size ;
bottom =3D r.Height - baseFont.Size * 2;
tickCount =3D chartData.YMin ;
yCount =3D (chartData.YMax-chartData.YMin) /
chartData.YTickSize ;
hspacing =3D (bottom-top) / yCount;
vspacing =3D (right) / chartData.XAxisTitles.Length;
//Left depends on width of text - for simplicities sake
assume that largest yvalue is the biggest
//Take into account the first X Axis title
float maxYTextSize =3D
g.MeasureString(chartData.YMax.ToString(), baseFont).Width;
float firstXTitle =3D
g.MeasureString(chartData.XAxisTitles[0], baseFont).Width;
left =3D (maxYTextSize > firstXTitle) ? maxYTextSize :
firstXTitle ;
left =3D r.X + left + 5 ;
//Calculate size of legend box
float maxLegendWidth =3D 0 ;
float maxLegendHeight =3D 0 ;
//Work out size of biggest legend
foreach (ChartLine cl in chartData.Lines) {
float currentWidth =3D g.MeasureString(cl.Title,
legendFont).Width;
float currentHeight =3D g.MeasureString(cl.Title,
legendFont).Height;
maxLegendWidth =3D (maxLegendWidth > currentWidth) ?
maxLegendWidth : currentWidth ;
maxLegendHeight =3D (maxLegendHeight > currentHeight) ?
maxLegendHeight : currentHeight ;
}
legendRect =3D new RectangleF(r.X+2, r.Y+2, maxLegendWidth +
25 + 5, ((maxLegendHeight+2)*chartData.Lines.Count) + 3) ;
}
private void DrawBackground() {
LinearGradientBrush b =3D new LinearGradientBrush(r,
Color.SteelBlue, backColor,LinearGradientMode.Horizontal);
g.FillRectangle(b, r);
b.Dispose();
}
private void InternalDrawChart() {
DrawGrid() ;
foreach (ChartLine cl in chartData.Lines) {
DrawLine(cl);
}
DrawLegend() ;
//Draw time on chart
string timeString =3D DateTime.ToString(DateTime.Now) ;
SizeF textsize =3D g.MeasureString(timeString,baseFont);
g.DrawString(timeString, baseFont, new
SolidBrush(foreColor), r.Width - textsize.Width - 5, textsize.Height * 2
/ 3) ;
}
private void DrawGrid() {
Pen gridPen =3D new Pen(chartData.GridColor) ;
//Vertical - include tick desc's
if (chartData.ShowVGridLines) {
for (int i =3D 0 ; (vspacing * i) < right; i++) {
float x =3D left + (vspacing *i);
string desc =3D chartData.XAxisTitles[i];
g.DrawLine(gridPen, x,top,x,bottom
+(baseFont.Size*1/3));
SizeF textsize =3D g.MeasureString(desc,baseFont);
g.DrawString(desc, baseFont, new
SolidBrush(chartData.GridColor), x-(textsize.Width/2), bottom +
(baseFont.Size*2/3)) ;
}
}
//Horizontal
if (chartData.ShowHGridLines) {
for (float i =3D bottom ; i > top; i-=3Dhspacing) {
string desc =3D tickCount.ToString();
tickCount+=3DchartData.YTickSize;
g.DrawLine(gridPen, right, i, left-3, i);
SizeF textsize =3D g.MeasureString(desc,baseFont);
g.DrawString(desc, baseFont, new
SolidBrush(chartData.GridColor), left-textsize.Width - 3, i -
(textsize.Height/2)) ;
}
}
}
private void DrawLine(ChartLine chartLine) {
Pen linePen =3D new Pen(chartLine.Color);
linePen.StartCap =3D LineCap.Round;
linePen.EndCap =3D LineCap.Round;
linePen.Width =3D chartLine.Width ;
linePen.DashStyle =3D chartLine.LineStyle;
PointF[] Values =3D new PointF[chartLine.Values.Length];
float scale =3D hspacing / chartData.YTickSize ;
for (int i =3D 0 ; i < chartLine.Values.Length; i++) {
float x =3D left + vspacing * i;
Values[i] =3D new PointF(x,
bottom-chartLine.Values[i]*scale);
}
g.DrawLines(linePen, Values);
}
private void DrawLegend() {
//Draw Legend Box
ControlPaint.DrawBorder(g, (Rectangle)legendRect,
SystemColors.WindowFrame, ButtonBorderStyle.Solid);
LinearGradientBrush b =3D new
LinearGradientBrush(legendRect, backColor, Color.SteelBlue,
LinearGradientMode.Horizontal);
r.Inflate(-1, -1);
g.FillRectangle(b, legendRect);
b.Dispose();
float startY =3D 5;
foreach (ChartLine cl in chartData.Lines) {
Pen p =3D new Pen(cl.Color) ;
p.Width =3D p.Width*4;
SizeF textsize =3D g.MeasureString(cl.Title,
legendFont);
float lineY =3D startY + textsize.Height / 2 ;
g.DrawLine(p, r.X + 7, lineY, r.X + 25, lineY);
g.DrawString(cl.Title, legendFont, new
SolidBrush(foreColor), r.X + 30, startY);
startY +=3D (textsize.Height+2);
}
}
}
}
------=_NextPart_000_0047_01C03369.DA5CA060
Content-Type: text/plain;
name="ATT00046.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="ATT00046.txt"
| [aspngbeta] member fredrik.normen@e... = YOUR ID
| http://www.asplists.com/asplists/aspngbeta.asp = JOIN/QUIT
| http://www.asplists.com/search = SEARCH Archives
------=_NextPart_000_0047_01C03369.DA5CA060--
Message #2 by "Anders Lundholm" <lundholm@s...> on Wed, 11 Oct 2000 13:25:54 +0200
|
|
I don't get a correct image Fredrik! All I see is a broken image in my
browser. I've checked that all components are properly compiled
(interpreted). Am I missing something?
Looks really great though! Clean code ..
with regards
anders lundholm · lundholm@s...
the sphereworx / monoliner experience
--
Message #3 by =?iso-8859-1?Q?Fredrik_Norm=E9n?= <fredrik.normen@e...> on Wed, 11 Oct 2000 14:34:41 +0200
|
|
hmm,
I have no problem with that..
Have you change line 57 from
if (Symbols <> nothing) then
to:
if (Not Symbols Is nothing) then
I only copy the file to my virtual directory add an \bin directory,
and run the mk.bat file.
/Fredrik Normen
-----Original Message-----
From: Anders Lundholm [mailto:lundholm@s...]
Sent: den 11 oktober 2000 13:26
To: ASP+
Subject: [aspx] Re: Image Generation Sample...
I don't get a correct image Fredrik! All I see is a broken image in my
browser. I've checked that all components are properly compiled
(interpreted). Am I missing something?
Looks really great though! Clean code ..
with regards
anders lundholm · lundholm@s...
the sphereworx / monoliner experience
--
Message #4 by "Anders Lundholm" <lundholm@s...> on Wed, 11 Oct 2000 16:46:44 +0200
|
|
When running the imagegenerator_vb.aspx file itself, I get an error at line
5.
"BC30466: The namespace or type 'ChartGenerator' for the import
'ChartGenerator' cannot be found."
Line 5: <%@ Import Namespace="ChartGenerator" %>
I have copied everything to a new directory and made it a virtual directory.
The MK file has also been invoked, and it worked!
with regards
anders lundholm · lundholm@s...
the sphereworx / monoliner experience
--
Message #5 by =?iso-8859-1?Q?Fredrik_Norm=E9n?= <fredrik.normen@e...> on Thu, 12 Oct 2000 08:54:56 +0200
|
|
This is a multi-part message in MIME format.
------=_NextPart_000_0010_01C03427.BE4D26B0
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
hi,
Hmm, if the ChartGenerator.dll is located in the \bin, there should not be
any problem.
Try to unpack this zip file and see if it would work..
/Fredrik Normen
-----Original Message-----
From: Anders Lundholm [mailto:lundholm@s...]
Sent: den 11 oktober 2000 16:47
To: ASP+
Subject: [aspx] Re: Image Generation Sample...
When running the imagegenerator_vb.aspx file itself, I get an error at line
5.
"BC30466: The namespace or type 'ChartGenerator' for the import
'ChartGenerator' cannot be found."
Line 5: <%@ Import Namespace="ChartGenerator" %>
I have copied everything to a new directory and made it a virtual directory.
The MK file has also been invoked, and it worked!
with regards
anders lundholm · lundholm@s...
the sphereworx / monoliner experience
--
---
FREE WEB DEVELOPMENT CODE, CONTENT, AND INSIGHTS
IN YOUR INBOX!
Get the latest and best HTML, XML, and JavaScript tips, tools, and
developments from the experts. Sign up for one or more of EarthWeb?s
FREE IT newsletters at http://www.earthweb.com today!
------=_NextPart_000_0010_01C03427.BE4D26B0
Content-Type: application/x-zip-compressed;
name="imagegen.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="imagegen.zip"
UEsDBBQAAAAIAJhwSylsWbnMthIAAAAuAAAQAAAAYmluL2NoYXJ0Z2VuLmRsbO1afXBc1XU/973d
93ZXK1m7+rBlS/bKX1lbIMtGUNtALNmybHVsbJAxK9tgVtKztGi1q+x7a1sRKmZwShgKTsLQEJqU
EjPUTQKBpqWGaUIYIGFImJQALYk7gaSkE2b4atJMEkjj/s69d3efJBPyd8J9s+eer3vuueeec9+H
tHPfp8gkogB+Z88SnSbVuuiD2zH8apY8VkP/FH6u9bTY8VzrntGMm5go5EcK6fHEUDqXy3uJQSdR
KOYSmVyiZ1d/Yjw/7LRXV0eWaxu7txLtECZdfdVrG0p2X6Wa1iphEa0EYSne7y4AqCXtWJfCDeU3
t1JP1yo+N1PCWqVb7sudbPfB7lWMdGFeg+a23URRFi8iaj6H+H0bJgn5yBDo7T663XOOeugDy5Wu
XOus+RNYTXvBLQyR9q2L1EKTM/XA7movONn8kPKVfZa2zpujt5lmtVcvUD37xkOOLSZa3kAktHzT
otkjfn9bbCRhJrJ6o+oNczoIn1eT2SGoiqTdmDGFRQQibWStXgoFJlaX5IaUW365VZJzmEyWX882
p8yS0kWKYU6bcio6h64xR9eYqRuo6Io5uqKiyz4GpY+230cmJKJWW9G1pG7Irxvyr1fJw355eK48
4pdH/HJbyqv88iq/PCTlUb886per/aj2y6v98rCU1/jlNXPl8/xyJlY/aLir4L2czEhiJyLSrjFf
Dkc3TwpkrpgdJjXCVoRtJRHBiJnHuiMehhnS7EbNDuRtHiDja1CstBd6DNYamaUeVvbn6kZKuj5b
YZ+8qiS/qMSJ6rTWlquZRLbX6N5QjpkdNvXDFsbHzEAiklhJ7jy2ZSWRZpGquNHYaAaSmC6SjANU
J+sA6wIFbMTEUtR8t1vPjKBhh2KBcCwYTKKKLavOaqOYxXUUpKKuNaPGmq7lMJrTTdwFphdyF5xe
xF1NYLpZ9sHpFtUnUdcRdIh1BFNR1z7Arq79YM0Ha/617gLep8Wc8wuTTVy+yfMxuZFsl3ANleJl
0yqsN87xMq7nSZMAkUUDY9Nxngpm/67LmOJp5WT7puuYrVXhXWTMJ1WuDEzXS50pXlGynnOnwceI
swcV2YDGAaz9041KURqY4qkgZt7+6flKIr1SI8C3bs+M7Z9eIHlNFQlPUWfH7WQzr1z518J7EYqH
kot5D2eos6HGu8+lV2VYdodptwlrOuZb9xK1bmalZIRSUszLp6iE1do0XLOSCTYZbrsuFs63ki6G
Ou1xLJAMy4AsnjM5Muf3qSxlxArFgh2BWLBNhKLhmAXUahPhasy0DOLzbzOuX8J+V9xekBrT1HJF
hWDnmW69jLDcwZTf+RW8VpVeqeRKKtVskNaiXyjPDGnuIzLUnK+NbrISYkuLcYSgcFaXx9t0kuR9
GHXaUcmIcryq2+p80YoYVhLzWXpZPzWS61ixDQQXFfZJTmb79jA6g2VMcQW557OTlTQfixsy0gNy
9QOgltLMguJ6iXCthug5Ie/jMe0pxlvuGrVQyYAha8MLGNtYtZ6fvVR+GFOcnfbYvlTUl2323dU6
PCGV5qFSzvtr6dgm7UWKQ6QDGvbnaWAGz+8ZrzQUl16pBe0fONcU5YWm5Ert+amqsseq2DZ1nj17
Vltu5iU+I9fGpuqC6x9k4voGLUQ+GiumGiqucFGnVPWXsoFtxoIqOHLqgVjQt7yY5V+fPZM5e4HK
Cuq8tInSGuillVXLdfGEfIAM1AUZ5YhfuhXrKuXy/ehX8TnP9ze9rdYCTjnu1nFnJnGfsMaSFygi
yPnXCdxMVslz6DZUl6hS0/iPtGhjdduF/lwIIxfqAnb4BA+IBVQolZXwXaF9A8kLYTU8P1UdLple
900dPTt5Eel7k0XbkI9rZD6qo4wLPflnXBHrAZqSG2SAZPnLspQV2uhulCkra6ChIXlxOfCWtnAJ
lQpVFkXVnIPMWv8UohWzKtUZDVXCVh0OJy/V6du1T0ZL2Q/NOcQCNvKzslOp0nkX9h1XLakxbFiF
XtLEDF+++M3OLXI5ZHFqzFbZ7Z8vlarCGvg42dihM4HK7y64JdJyrOkAAncA+35Ff0//sY55W9/5
+is7Th/ev+tHS45ezc/VWzYe6Ms53kRx8MCRI0cK+bx3IDdyxD0wmMkdGBpNF7wRJ9c+MTxIH7YP
2x9527JrZ5t61wxSCvArKMxlf4EqxAP6G3jYX9bvFTK5EZc13sFxWI/6WrY5m+fiCDSoV+dlV/ZT
fQnfdmVfT8l4PYmrGr4owl3A3xUXUJd6r+VK5s8KqHPCKU14WCGcPrJ+cYzK7wZ4ZiecDlI/oPvL
ZW9RjkYAPwUYoafoy1RDbaJZ1NDVogdwbYDxSyQ8IGFRwlsBLbKCvwhY1BNcF7TIC6YBb5HwzuAI
7DwePBWsoe8EWf9tCeMWw5VWD8ZebrFO2mI7U1Yams9YPON/Svi25FfZrNNs86h1EnbZLM1J/FbA
OJ22T9lxehqQfK30dULg6i69/qMdpRtlTIS8Ku2zkh9EdGby79X8EPbD8PFflnwb3NYZ+u9o/Vpa
jaj+ljoBbbEeMAYoaK3YDXix2AM4IlKAHxMHAC80vga4ScIeCfuMRwCvNB4D3G/wKMf4BqAn4Vtm
Ugj6tcma/yehGWBoS1gj4QIJl0iYlHBj4DyM6g10AG4PsM0rJEwHOsG5TsJjgfViNycf/eWCKXEQ
0lSZGgI1qqjQjSKDiNygqVtFDtQnNXWn8BDjezR1UkyCOqWph8UNiPJTmvpXcROoFzX1bciC9I6m
noeM33IVdUZ8ElFs1tR/i9tAnaep/xF3YC+2aOo98VlQOxRFQWMIu5fSspuMJ/BmnNfUp42nQR3V
1D2QReiEpk5BFqG7NPUwZFX0VU09BlkVndbUk8azFKXvaeoF43ugXtbUfxkvUTW9rak3jR+C+rWm
fmVkkN3z4ooKmjlQCzRVZ76Kql2jqZXma6DWa2oDZLW0S1M7IKullKLkjsXouJY9YL4H6n5NPWIK
rhdF0eNmSNTTS5p6ErIGek1Tz0I2Hw+3ivq+WSMWUKumzpj1oonWaOon5kKxkD5aV5m9mXpnULu1
5mcCl4hmeqhMbRVLqLOeqRvp84GDOLeyjYr6Z0l9RVNPSerAfEX9u6TWNynqlUC9WEFvaOpnkPGH
R64vhsuCHwz/cE0/3F+Gxhy+8b6jbpJSNfZvJH5vkM+it0yStcmc3gBztvNXRNQmnyTpAJ/vSuci
e4CmxJUiRhzbVloVPC7SwG+iJvp48A5U5APmXYCPmF8EfNw8BfikxJ+V+PfNBwDPmP8oPoad+xfs
I9u5HPAbYi09H/yW2AD8OdFKZ2C5lX4K2A3OS4DvBt8BDFtPUDc1W7+U/HcxqtMyjQ3EFbiBeq07
6B8oZd2AN+MRK2w8DP4T4BfBb6KbrZjxKN1pNYLfCzuP0r3Wq5B+SUofAuyDzYVGKz1mHce4KXGR
sZZ+aW02nifTPkg/oHq73/gB7KeMH0Oawywfsa8xXtf4K4EjwLfbdwBeKeF74ml6na61J+k30Pkc
rBXte4w+usE+bQhxl31chMV/2C8aPNePsYqf2G/KGX+Bsex5O6o8Yp6kZXSL2C+uFY7IiJwoiMNi
ShwTXxBnxBviPNGBM303dYqlOLfVtU5if27sMjLGenKNdcaNxgnjAHhMKXgKnK8BZ+570ORRJwyW
8t0pgBMsKO/bbeLznN54yblX9ouM+2W/VPdJ40uyX2N8VfYHzddln9F9Tveu+absbzB/LvtPmMru
CfNXsv9b3b9uLhWciab2wwQexMXPCkHgNi6BE9UGHsYlcEqGgVfhEjj5qoBX48JdCNDA2TQPeAzQ
oDh6QXWABh5n6oA3ABrUiF7QfECDFqAXyIf5wBeiF7QI0MBJsgh4C6CBZ5kW4EsADVTBEuBLAQPH
aFZbGKxg/2bXIH8ikhJ0jeyZmskfkf2SOfxmeZO/eA5fPXU8bqhnB9n2OgU3k88l8of4T0VeZtxJ
pEfSmZzrJY6MZoZGE96ok8DbUbowmci4icFiJuslNibWdXR0tK/tbF+7fu269rUddMnO/HAx63yU
yi9Rw9ksjbtD+UI2M0j9k67njNPedLbo7JmccGhHJuf0pL00bWH9bU7OKaS9fIF2DV7nDHmKyzoK
k5rKRvuWfDYLFfjstm9Ou45LbHC4wmZmZdjysqkdGVcb3pobYdPMlB65Et2T8bKK2T85PpjPlibs
KaSP4DGYMAMczEJewfyOab1Sv66HetLuaL83CausW8Guygx7o9Q+xAsecbyDyp5bxpi3ozzCnUGx
TPvnVlDmKv/dMsY8vTy3gjJXze+WsX7HK+9HZSZtWhnTo5X+5J7M0Fh/5uMOTe5MHwXI5Oho99GM
K3VduUbMVMgM65WN5o9s3wZyhxQwubdCskcDZYvuDErKeA63hCgOJnRLCHNSvtndWXQpmm45koq3
reLfDEpGeJbHc1klrb1ztXysykqk89Jfv29KqzL3rEn650aqj+vILSHdw8PUl3Odgodu2Dm66xDS
NOdx/dIVznj+MCohPzG5J09SfahcTFnnkEeFzMioR15+ggbznpcfJw/ebsnjGKBJ1Y26E+khTv7D
JWRbIT2BcwHOYIIhL50bQXYUaDDNI3kJh/IFXSC98AQC15FI1sGpMCzR8sBezWUGbc544+kJ4vKR
VUpb0tmhYjbtOaqYcTTl+KhypcpmTDhSgJMcAM8p5NLZykjGOGwSkceIRORc5XLNpEdyedfjtfQ4
g8WRkfRg1un28M47WPSc8kFGhzn1Zew3M6KHX+Ec0ucNRh9KF7PeTmd80ClUDGR4Q85xalGfPIlU
WgJJFwrpSeqraFC35ByRtTbqyE2adcb0jadHeDd2Z4462d58YTyNBADPod5CflxhymOESdX8aAY+
cfh70+OZ7KRkziJlojLPd9Soo2A8n/dGMSFOeVWiMzmsuV07mpEZsSevPh4Q2+ylnU7aLRYczZMV
S31bc8VxfexvczwfJc/EYqHgIFd2Iocv47/Xy8LXxyWnpvLOcbJyV3iT0wUk53AGozYXiu7oLJ50
VAl6M9lsJXl7Mu5EHrcM1AXuAeNqNZflj1B/PpsZViM47tr53UiJofLticEWZK2MiQduidiaGy6h
ldvA7nwGAS9npUv5iYNbj05kM0OZ0hbL0ikd07nh/JHeQnq8nHVg8W67ssoL+exuVDoqp4jqzW3O
F4adgppIVoikUR2HuIb4Xh8yRz/d+MJ9D15Qf/tn6r7wRssnVtzz7eQPm7Z/7mfX1J65uD5y4uR5
S19ecnLbt/7+cH7bExd+d8HIpabVEjWsmvrvrHz0icbffvnFk7dveWD9fZG/+uuxwmHTisXwC+HX
YFghM0EimBAiFgokKBaTaIzRBok2QF4TAAZALVHmtUTBCzEvFEhiCIMGMwm1JDSAhAwrCg9qTCte
b1gGtKOsHWULNdICG4vXMxqvh9hgsYGRUTbBdsBOkgGFeDRkJQwRivPUChoSQmJD0AKFYJLVMFst
fk1YVwv6VvQrQgkzvioUitfOS1gi3hRriaHFW+O1QQw1jIDNa7V5lTYWaPPSbBHCL8oEc+CILQz+
X4dYGE+q8jwm9v5C+NwcYo0oGws1g5bAYCCa2ev4pSE7YYpQKNZtEeaPb7UTAZChEA+pidbadnyV
z61V8HsVG+/jDdgJ70W8LxrbKXficiw3NlATb2WFqxG1ZjYWRZtnR7iLM4gNQGbFo1WQKbsxh+MU
z8Ra2Nk0hPy2FxvH03ZNbDySCArYjGei0bAdiEdrlIHYQBiCeJFNVtuheDHEEv5hfFH6M8lriEZD
bLzYEpuO2EHZR0PRgIUeK4YDK+oPxx4ffHjw/P997JpR43jsRw81tN78TJQCpe04dot0dYVyVYYy
pB1eUYP4pLGueBFzx6+2BAn9HayqG3evDOGOKMmfD4/dnKTf9N185qXBu/usTd/V/6PD7a3S/0Gd
o73q06s0HFWFnmx2J6pUPQs7jnwu5nZ2BdV2nWvQh+1Psqn/hVqg/rVvBp8zteMcfG785TjVRXTc
97n3uNEJuJf66SDgVroCWB/tostA9wH2Auf29cDbvyvZ8bdNuuc3RP9XZG78fV/AahpV04u6yZID
mzk6RHkpXy5H7YE0DS5eBdB70MuDUu2hwGvyK1Y/+Fx5/EV/rqVvSp2O8tVJgxwDjg/4W6AzjsuB
vkf8B4qEjz8h557EStNSh1tSykvz9ODn0pCcf2KGfx0U8untJX62dWfI230/gl/8TaFP+sG6OXmS
VGYeolEZKzyvSG9VjNiXHaBHpDZ7PQF/2ZsR6Htlfys6KqLDoMelvTG5at4P/naxS4/N6PlL/ufe
14922MrqM0/FbjekeXCL0PVmxK5TxmSmfHZkZsflw/YHtA79P6OdH6T4YftjbP8PUEsDBAoAAAAA
AH1ETCkAAAAAAAAAAAAAAAAEAAAAYmluL1BLAwQUAAAACADbcEsp5gtL80kDAACOCQAAFgAAAElt
YWdlR2VuZXJhdG9yX1ZiLmFzcHi1Vm1P2zAQ/j5p/8GKNNFIENryojFRNGgL6tQCIxXbPk2mvbYe
id3ZF6Cb9t93dpI2CZS9aLNU52I/d77ec3fx4au37JJPgfW5nCYktLzrE4+1lUSQOFzMaUHEtL79
ZQ5Tj706evnikHR68VxpZOc8BjPnI0KFC4MQBx3N74X8A2T+bHb+QKdHLv3ilPaMazwDCZqj0imS
sGakxRxZVPq7OpEcWwb0HWgHYzROEzlCoSQ7AwxRjW47gFxEphYu4hsVMW5YiJq88K3ojusLCSzX
t6MjYhYvVnsElHC/AhexYsJqJjXdYl5sJuj5DGcgi6DcqHPomkcJmJo7PyRHIiDN72y/vskaDTs1
7fTaTXs0HZDU3LXTQZ39qJot+Bl8EGOckbG99ZC2ipQmiHsGH2YCYT3YTiEunIMdbmZODkIVifF6
paFAp+ANxEgroyZIh+l5wGqD8HToe+s1w2UYLfIZYBpBAhbiWUZrwETLolIxbhAZKPNmEvmXtKVE
7VmimjRZFu2zYX8k7/xjxq7gmdA/zVdH4W+wFSYy54nE36OJgP+TJTmm6iquZHipcEYE5DtdwuVV
n6+FyY1rkJ/7io9rIZkCbYm7uPkCI9xkXfvSvaNmeaynxi9V/wbL+g+kFU+hRM5OiQTbvyCgUW0W
H48flqnhmotLDe/gTb1+PPA2rbSTSY36crHRWInNlUjSZSbtWMlmUH5Y+dhBGjjnHx19nvcou7BC
FlDBp6EY3Ybim6W8WV+DGfAHu723dl9I2l+zS6EQxmWVpd4FphqtNIGq8bqCr5QgGLxPQC/S1YB6
eFZ2XlqrxvOrzfdcYW6R9UyeHE8W84Q4FK06Q5VrBH2QU5xtNapFmnpqlplb/li0Hn1dMvdqwg+G
qq/uQfuPTbqeszJ5eFT1llVHXIisPdkEx+NxwYZf1XlcNDTO4QFLKf4YtcHaGmzK9+TWAGKlF+xE
4IDPmZqwd5fdsyqJGeddOc2+kMvsS5cqlFuPM4OEzaRW2Yq7J7j32n6deueunQoR8MsOX6VVndmi
jAEesxM+umVDxdqRoOIuKhRcCEJ+B7UrunMoaSC4SHCeYGpgMy1yqvaYY2D/eBbizJBtNtRc3KVk
O72VHP0EUEsDBBQAAAAIAPxISymSGrAAkgEAAG8DAAAQAAAAU3RvY2tQaWNrZXIuYXNweH1SwU7j
MBC9I/EPIyNBUVEirjTparcChLQrkAKV9oQcZ9p469jInlRFiH/HdprSsi1zSMb2PPvNe5M5YeUL
geJ63vI55mxywsC2mlPu0C7Rjo+Pjo8AYGlkBZOaW/pF+nmipFgM7st/KAgc6grtBVwvUdNPO3eA
5/AWUT76vwjY5K7xrzxZBTmwmN+iRsvJ2OdpmXD3svrBRruQqXSyVOgRZFscrfn4mBmLXNSD39LR
HWEDMn40FGTEwiVhz0UmPcKHnMEg1CUFKk8eK8i7i7co7yU89Izda1Ma5XIGw/hYMuWqRb9gp5+s
fbz3eZe8BwZZ2mkdBc1qalQvbVaa6nX8yTLzjTV7TVif15fjQhiiM9e1Cg/eDbRZ6g92K72gV6JG
sSjNSnmZQFY56+T5z2bYjogMiNDm+E9x85ilO1vf1hetPlzenWyz2kO6bImMBsIV+ZkMTsBf01rY
uNY3ca/jLK6LNrO52136VcCvioYno9NRoOg8g976nDFYD2E+48rhwbuzNFi38TXdGOutCYZ/AFBL
AQIUABQAAAAIAJhwSylsWbnMthIAAAAuAAAQAAAAAAAAAAAAIAC2gQAAAABiaW4vY2hhcnRnZW4u
ZGxsUEsBAhQACgAAAAAAfURMKQAAAAAAAAAAAAAAAAQAAAAAAAAAAAAQAP9B5BIAAGJpbi9QSwEC
FAAUAAAACADbcEsp5gtL80kDAACOCQAAFgAAAAAAAAABACAAtoEGEwAASW1hZ2VHZW5lcmF0b3Jf
VmIuYXNweFBLAQIUABQAAAAIAPxISymSGrAAkgEAAG8DAAAQAAAAAAAAAAEAIAC2gYMWAABTdG9j
a1BpY2tlci5hc3B4UEsFBgAAAAAEAAQA8gAAAEMYAAAAAA==
------=_NextPart_000_0010_01C03427.BE4D26B0--
Message #6 by "Anders Lundholm" <lundholm@s...> on Thu, 12 Oct 2000 16:31:39 +0200
|
|
Hello!
It works now. I had a sub-directory below the website-directory where I
placed the /bin directory. The sub-directory actually was a virtual
directory, but not defined as a website.
I guess the /bin only is supposed to reside in the root of the
website-directory?!
The graph-page is really awesome. It surely shows what is possible with the
framework and the classes. Some of collegues have been working heavily with
the ASPImage component. It seems like it's becoming obsolete now!
Is it possible to do antialiased text too? I didn't see that in the
documentation!
Thanks in advance!
with regards
anders lundholm · lundholm@s...
the sphereworx / monoliner experience
--
|
|
 |